shell中的控制流包括if then else语句,case语句,for循环,until循环,while循环,break控制,continue控制。
条件测试:
有时判断字符串是否相等或检查文件状态或是数字测试等,Test命令用于测试字符串、文件状态和数字。
文件状态测试:
在Linux下敲入命令,效果如下:
test -w tmp.txt和[ -w tmp.txt ]的作用是一样的。
也可以测试两个表达式,例如:[ EXPRESSION1 -a EXPRESSION2 ] 或者test EXPRESSION1 -a EXPRESSION2
示例程序如下:
1 #!/bin/bash 2 3 [ -d test ] 4 5 if [ $? -eq "0" ];then 6 echo "file is exist"; 7 else 8 echo "file not exist"; 9 fi
执行结果如下:
字符串测试:
测试两个字符串是否相等,如下所示:
测试相等时, = 两边要有空格,给变量赋值时,=号两边不能有空格。
数值测试:
示例如下:
数字运算:
运算符测试如下:
要想执行正确的运算,加号两边要有空格。
if then else语句:
if 条件
then 命令
fi
示例:
if [ "13" -lt "12" ]
then echo "yes 13 is less than 12"
else
echo "NO"
fi
1 if [ "13" -lt "12" ] 2 3 then echo "yes 13 is less than 12" 4 else 5 echo "NO" 6 fi
1 if [ "13" -lt "12" ];then 2 echo "yes 13 is less than 12" 3 else 4 echo "NO" 5 fi
执行结果如下:
if else then也可以写成下面的语法:
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令3
fi
如下所示:
case语句:
示例程序如下:
1 #!/bin/bash 2 3 echo "enter a num(1-3):" 4 5 read num 6 7 case $num in 8 1) 9 echo "num is 1" 10 ;; 11 2) 12 echo "num is 2" 13 ;; 14 3) 15 echo "num is 3" 16 ;; 17 y|Y) 18 echo "you select y" 19 ;; 20 *) 21 echo "quit" 22 exit 23 ;; 24 esac
执行结果如下:
basename可以从完整路径中取出文件名字:
for循环:
下图两个程序不一样,其中第一个是一个变量,第二个是三个变量:
再看一个for的示例程序:
1 #!/bin/bash 2 3 for i in `cat file2.txt` 4 do 5 echo $i 6 done
其中in后面是反引号,里面的命令会执行,因此输出如下:
file2.txt中的内容如果是下面这样,那打印结果如何呢?
打印结果如下:
可见for循环在列表中取每一项的时候,换行符和空格都作为分隔符。
如果for语句的后面没有in语句,此时语句等价于: in $@
示例如下:
运行结果如下:
until循环:
awk从一行数据中提取1列, sed的用法为 sed 's/old/new/g' s表示替换,old是匹配到的老的数据,new是要替换成的新数据,g表示全部替换。
上述程序中,当锁文件不存在时,退出until循环,until的意思是直到这个条件为真,就退出。注意[ ]里面的取反!。
grep和awk小实例:
while循环:
示例如下:
上述程序中,循环读入名字。
从文件中读数据的示例如下:
这个格式是固定的,重定位的文件名只能写在done之后。按行读入。如果写在LINE之后,程序会出错。
break和cotinue:
示例如下:
while后面的冒号表示死循环。
continue用法示例如下: