Shell脚本学习1

简介: Shell脚本学习1

Shell脚本学习


1、Shell简介

Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本

Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell

Shell脚本文件的扩展名为.sh(sh代表shell)


2、第一个Shell程序

#!/bin/bash
echo "hello word!"


命令行运行:

chmod +x test.sh
./test.sh

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell

#开头的行就是注释,会被解释器忽略,sh里没有多行注释


3、echo/printf/read

echo使用:

echo:是Shell的一个内部指令,用于在屏幕上打印出指定的字符串

echo arg #输出arg变量
echo -e arg #执行arg里的转义字符。echo加了-e默认会换行
echo arg > myfile #显示结果重定向至文件,会生成myfile文件


注意:

echo后单引号和双引号作用是不同的

单引号不能转义里面的字符,双引号可有可无,单引号主要用在原样输出中

printf使用:

printf 命令用于格式化输出, 是echo命令的增强版

printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)

printf 由 POSIX 标准所定义,移植性要比 echo


printf 命令的语法:

printf  format-string  [arguments...]
#format-string 为格式控制字符串,arguments 为参数列表。功能和用法与c语言的 printf 命令类似。


说明:

  • printf 命令不用加括号
  • format-string 可以没有引号,但最好加上,单引号双引号均可
  • 参数比格式控制符(%)多时,格式控制符可以重用,可以将所有参数都转换
  • arguments 使用空格分隔,不用逗号
# 1.双引号
printf "%d %s\n" 10 "abc"
10 abc
# 2.单引号与双引号效果一样 
printf '%d %s\n' 10 "abc" 
10 abc
# 3.没有引号也可以输出
printf %s abc
abc
# 但是下面的会出错:
printf %d %s 10 abc 
# 因为系统分不清楚哪个是参数,这时候最好加引号了。
# 4.格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
$ printf %s a b c
abc
$ printf "%s\n" a b c
a
b
c
# 5.如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
$ printf "%s and %d \n" 
and 0
# 6.如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
$ printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0'
$


read使用:

命令行从输入设备读入内容

#!/bin/bash
echo "What is your name?"
read NAME #输入
echo "Hello, $NAME"


4、变量

变量定义及使用

Shell支持自定义变量

定义变量:变量名不加美元符号($)

variableName="value"

注意:

变量名和等号之间不能有空格,有空格会出错

如果手误写错(例如 var = test),刚好要使用rm -rf $var/删除这个目录,实际删除的是/

变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)
  • 中间不能有空格,可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)


使用变量:在变量名前面加美元符号($)即可

your_name="ll"
echo $your_name
echo ${your_name}


变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

for skill in C PHP Python Java 
do
    echo "I am good at ${skill}Script"
done


如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),所以推荐给所有变量加上花括号


已定义的变量,可以被重新定义

url="http://www.baidu.com"
readonly url
url="http://www.baidu.com"


注:readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

使用 unset 命令可以删除变量:

unset variable_name

说明:变量被删除后不能再次使用,unset 命令不能删除只读变量


变量类型

三种变量:

  1. 局部变量 :局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量 :所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量 :shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。


特殊变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。


$*$@ 的区别:

$*$@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(" “)包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;“$@” 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
    echo "$var"
done


print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d

5、转义字符

转义字符  含义
\\  反斜杠
\a  警报,响铃
\b  退格(删除键)
\f  换页(FF),将当前位置移到下页开头
\n  换行
\r  回车
\t  水平制表符(tab键) 
\v  垂直制表符


shell默认是不转义上面的字符的,需要加-e选项

#!/bin/bash
a=11
echo  "a is $a \n"
echo -e "a is $a \n"


6、命令替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。

可以使用的变量替换形式:

形式 说明
${var} 变量本来的值
${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。
${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。


7、Shell脚本样例

下面的脚本用于php安装过程中安装zip扩展:

#!/bin/bash
#zip install
if [ -d php-5.4.25/ext/zip ];then
  cd php-5.4.25/ext/zip
else
  tar zxvf php-5.4.25.tar.gz
  cd php-5.4.25/ext/zip
fi
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
[ $? != 0 ] && exit
make install
echo 
grep 'no-debug-zts-20100525' /usr/local/php/etc/php.ini
if [ $? != 0 ];then
        echo '' >> /usr/local/php/etc/php.ini
        echo 'extension_dir=/usr/local/php/lib/php/extensions/no-debug-zts-20100525' >> /usr/local/php/etc/php.ini
fi
grep 'zip.so' /usr/local/php/etc/php.ini
if [ $? != 0 ];then
  echo 'extension=zip.so' >> /usr/local/php/etc/php.ini
fi
echo "zip install is OK"
/usr/local/apache2/bin/apachectl restart
cd -
rm -rf php-5.4.25
echo "all ok!"
ls /usr/local/php/lib/php/extensions/no-debug-zts-20100525/


相关文章
|
2月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
114 1
|
1月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
67 2
6种方法打造出色的Shell脚本
|
1月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
62 1
|
1月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
52 2
|
2月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
60 6
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
83 12
|
2月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
77 2
|
3月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
2月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
36 0