一、基本语法:
shell必须以#!/bin/sh开始。
1.1、注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。
1.2、管道
管道 (|): 将一个命令的输出作为另外一个命令的输入。
exp : ifconfig eth0 | awk -F '[ :]+' 'NR==2 {print $4}'
将ifconfig的输出输入给awk,然后awk提取出在第二行的ip地址。
1.3、重定向
重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
> : 写入文件并覆盖旧文件 。
>> : 加到文件的尾部,保留旧文件内容。
1.4、关键字
if then elif else fi
while do done until for in
break continue return
二、变量:
数值 var=123
字符串 str="Hello world!"
数值数组 dArray=(2 4 6 8)
字符串数组 sArray=(one two three four)
打印整个数组 echo ${array[*]}
得到数组长度 len=${#array[*]}
打印数组中单个元素 echo ${array[0]}, echo ${array[1]}, echo ${array[2]},...
修改数组中某个元素: array[2]="Hello"
备注:1、赋值等号前后不得有空格;
2、单引号仅是字符串;如 echo '$str' 其打印为: $str
3、双引号可以包含变里;如 echo "$str" 其打印为:Hello world!
三、语句:
3.1、算术比较:
算术比较 |
结果 |
expression1 –eq expression2 |
如果两个表达式相等则结果为真 |
expression1 –ne expression2 |
如果两个表达式不等则结果为真 |
expression1 –gt expression2 |
expression1大于expression2则为真 |
expression1 –ge expression2 |
expression1大于等于expression2则为真 |
expression1 –lt expression2 |
expression1小于expression2则为真 |
expression1 –le expression2 |
expression1小于等于expression2则为真 |
! expression |
如果表达式为假则结果为真,反之亦然 |
3.2、字符串比较:
字符串比较 |
结果 |
string1 = string2 |
如果两个字符串相同则结果为真("="前后有空格) |
string1 != string2 |
如果两个字符串不同则结果为真("!="前后有空格) |
-n string |
如果字符串不为空则结果为真 |
-z string |
如果字符串为null(一个空串)则结果为真 |
3.3、文件条件:
文件条件 |
结果 |
-d file |
如果文件是一个目录则结果为真 |
-e file |
如果文件存在则结果为真。要注意的是,历史上-e选项不可移植,所以通常使用的是-f选项 |
-f file |
如果文件是一个普通文件则结果为真 |
-g file |
如果文件的set-group-id位被设置则结果为真 |
-r file |
如果文件可读则结果为真 |
-s file |
如果文件的大小不为0则结果为真 |
-u file |
如果文件的set-user-id位被设置则结果为真 |
-w file |
如果文件可写则结果为真 |
-x file |
如果文件可执行则结果为真 |
3.4、if 语句
A、简单if语句:
或者
B、分支if语句:
或者
C、多分支if语句:
D、复合条件:
注意1:以上[ 条件 ]前后都要有空格;if与[ 条件 ]也要有空格。(这是shell的语法规定)
注意2:当比较字符串时,= 和 !=的前后都有空格,若不加空格,则判断结果会出错;且
字符串变量需加双引号,这样做的目的是防止隐蔽的语法问题,如下:
if [ "$temp" = "yes" ]; then
语句
fi
3.5、if语句高级特性——双圆括号
双圆括号命令支持将高级数学表达式放入比较中,如同C语言一样编写。示例如下:
结果:
3.6、if语句高级特性——双方括号
双方括号命令提供了针对字符串比较的高级特性。
3.7、while语句:
或者 或者
3.8、C语言风格的for语句:加上双圆括号后,就可以如同C语言一样编写,示例如下:
结果:
四、函数:
函数根据返回值的类型可分为两种,具体如下:
4.1、返回值为0~~255这间的数值
4.2、返回值为字符串,字符串中可以包含空格
说明:当要求返回值为数值时,则函数里边得用 retrun返回;当要求返回值为字符串时,则函数里边得用 echo返回。
五、正则与命令:
grep : 与正则表达式配合可实现查找类工作。
exp : ps -ef | grep wpa_supplicant | grep -v "grep"
说明:查找 wpa_supplicant 进程是否存活。
awk : 可实现提取想要的字符功能。
exp : ps -ef | grep wpa_supplicant | grep -v "grep" | awk '{print $2}'
说明:提取 wpa_supplicant 进程的PID。
exp : grep '^onlineMode=' conf.conf | awk -F = '{print $2}'
说明:首先在conf.conf文件中查找“onlineMode=”的行,然后由awk提取“=”后的字符。
sed : 可实现按要求修改字符功能:
exp : Mac=`echo $line | grep "Cell" | awk '{print $5}' | sed -e 's/:/-/g'`
说明:首先在变量line中查找“Cell”,然后再提取第五项,再然后将第五项中的“:”改为“-”,最后将修改的值存入变量Mac中。
exp : sed -i '/nameserver/'d /etc/resolv.conf
说明:删除/etc/resolv.conf文件中包含"nameserver"字段的行。
exp : sed -i "s/111/222/g" conf.conf
说明:将conf.conf文件中的111替换成222,并写回文件。
exp : sed -e "s/111/222/g" conf.conf
说明:将111换成222,但不写回文件。这就是"-e"和"-i"参数的差别:"-e"不修改文件,只是打印输出显示改了。
六、调试
sh -x test.sh