11章 使用结构化命令
if command
then
command
fi
这个结构就是if 部分命令成功运行 ,就执行then,否则跳过then。就是C语言中的if没有else的部分。但是不要理解为ifcommand为真执行then部分的命令。
if command
then
command
else
command
fi
如果if后面的命令退出状态码=0,那么就执行then,否则,执行else
if command1
then
commands
elif command2
then
commands
fi
test命令
test命令中列出的条件成立,test命令就会退出并且返回退出状态码0,如果条件不成立,返回退出状态码1.在这种情况下,if形式完全等同于其他语言的if语句
if test condition
then
commands
fi
#或者
if [ command ]
then
commands
fi
#方括号两边必须加入一个空格,不然会报错
test命令可以比较3类条件,数字比较,字符串比较,文件比较
1 数值比较
比较 描述
n1 -eq n2 检查n1是否与n2相等
n1 -ge n2 检查n1是否大于或等于n2
n1 -gt n2 检查n1是否大于n2
n1 -le n2 检查n1是否小于或等于n2
n1 -lt n2 检查n1是否小于n2
n1 -ne n2 检查n1是否不等于n2
注意:不能使用浮点数
2 字符串比较
比较 描述
str1 = str2 检查str1是否和str2相同
str1 != str2 检查str1是否和str2不同
str1 < str2 检查str1是否比str2小
str1 > str2 检查str1是否比str2大
-n str1 检查str1的长度是否非0
-z str1 检查str1的长度是否为0
1.大于小于符号要转义,不然会被识别为重定向符号
2.test命令根据ASCII顺序排序,与sort命令不同
字符串长度
当变量为空字符串或者没有初始化时,变成长度是0
空字符串或没有初始化的变量可能会对程序有灾难性影响,使用前最好先使用test命令中的-n和-z确认
3文件比较
比较 描述
-d file 检查file是否存在并且是否是一个目录
-e file 检查file是否存在
-f file 检查file是否存在并且是否是一个文件
-r file 检查file是否存在并可读
-s 检查file是否存在并非空
-w 检查file是否存在并可写
-x 检查file是否存在并可执行
-O 检查file是否存在并属于当前用户所有
-G 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新(new than)
file1 -ot file2 检查file1是否比file2旧(old than)
这是比较文件的创建时间
多个条件一起判断:|| &&
使用双尖括号
将高级数学表达式放入其中。
命令符号
符号 描述
val++ 后增
val– 后减
++val 先增
–val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
的>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或
使用双方括号
提供了模式匹配(pattern matching)特性,可以在其中使用正则表达式
if [[ $USER == r* ]]
case命令
命令格式:
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
bash中是可以在case中检查字符串的
case $USER in
rich | barbara)
echo "welcome $USER";;
testing)
echo"echo "special testing account";;
jessica)
echo "do not forget to log off when you are done";;
*)
echo "sorry you are not allowed here";;
esac
12章 更多的结构化命令
for var in list
do
command
done
list中根据空格确定var,也可以更改字段分隔符(空格,制表符,换行符)
在shell脚本中更改IFS环境变量
IFS=$’\n’
for var in cat $file
for var in /home/rich/test/*
C语言风格的for命令
for((variable assignment;condtion;interator process))
do
commands
done
for((i=1;i<=10;++i))
while命令
while test command
do
other commands
done
当使用多个测试命令,只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环
until命令
其工作方式与while相反,要求指定一个输出非零退出状态码的测试命令
until test commands
do
other commands
done
控制循环
break
continue
他们都可以指定跳出/继续的循环层数
break n
continue n
n默认都为1
处理循环的输出
可以在循环的done之后接管输出,比如
for var in A B C
do
echo "$var"
done > out.txt
for var in A B C
do
echo "$var"
done | sort