《Linux Command Line and Shell Scripting Bible》Part 12 使用结构化命令
12.1使用if-then语句
最基本的结构化命令
if command
then
command
fi
这里的command必须exit的返回值是0
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test1.sh /Users/shijianzhong/learn_shell/part_12 It worked shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test1.sh #! /bin/bash if pwd then echo It worked fi shijianzhongdeMacBook-Pro:part_12 shijianzhong$
有些脚本可能的写法为if command; then
commands
fi
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test3.sh _driverkit:*:270:270:DriverKit:/var/empty:/usr/bin/false This is my first command This is my second command I can even put in other commands besides echo; ls: /home/_driver/.b*: No such file or directory shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test3.sh #! /bin/bash testuser=_driver if grep $testuser /etc/passwd # 如果匹配不到就不会执行then语句 then echo "This is my first command" echo "This is my second command" echo "I can even put in other commands besides echo;" ls -a /home/$testuser/.b* fi shijianzhongdeMacBook-Pro:part_12 shijianzhong$
12.2 if-then-else语句
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test4.sh #! /bin/bash testuser=sidian if grep $testuser /etc/passwd then echo "This is my first command" echo "This is my second command" echo "I can even put in other commands besides echo;" ls -a /home/$testuser/.b* else echo "The user $testuser does not exist on this system\n" fi shijianzhongdeMacBook-Pro:part_12 shijianzhong$
12.3嵌套if
if command
then
if command
then
commands
else
if command
then
commands
fi
还有一种elif格式,跟很多编程语言一样,比较好理解
12.4 test命令
前面的if 条件孩子能测试命令退出状态的条件,test可以测试命令状态退出状态码之外的条件
test 用来测试变量中是否有内容
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ a="" shijianzhongdeMacBook-Pro:part_12 shijianzhong$ b="12" shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test $a shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $? 1 shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test $b shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $? 0 shijianzhongdeMacBook-Pro:part_12 shijianzhong$
如果写在脚本里面用作判断也非常方便,代码不抄写了,逻辑比较简单
bash shell提供[]的条件测试
if [ condition ]
then
commands
fi
test与[]的功能相等,可以用来判断
数值比较,字符串比较,文件比较
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test 1 -eq 1 shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $? 0 shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test 1 -eq 2 shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $? 1 shijianzhongdeMacBook-Pro:part_12 shijianzhong$
数值比较
-eq 等于 -ge 大于等于 -gt 大于 -le小于等于 -lt 小于 -ne 不相等
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./numeric_test.sh The test value 10 is greater than 5 The values are different shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat numeric_test.sh #! /bin/bash value1=10 value2=11 if [ $value1 -gt 5 ] then echo "The test value $value1 is greater than 5" fi if [ $value1 -eq $value2 ] then echo "The values are equl" else echo "The values are different" fi shijianzhongdeMacBook-Pro:part_12 shijianzhong$
在bash shell只能处理整数,可以通过echo输出变量,但如果条件中,浮点数进行大小比较,就会报错了。
字符串比较
str1=str2 检查是否相同 !=不等于 >大于 <小于 -n 检查是否有内容 -z检查是否为空
检查相等
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test7.sh Welcome shijianzhong shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test7.sh #! /bin/bash testuer=shijianzhong if [ $USER=$testuer ] then echo "Welcome $testuer" fi shijianzhongdeMacBook-Pro:part_12 shijianzhong$
检查不相等
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test8.sh This is not shijianzh shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test8.sh #! /bin/bash testuer=shijianzh if [ $USER != $testuer ] then echo "This is not $testuer" else echo "Welcome $testuer" fi shijianzhongdeMacBook-Pro:part_12 shijianzhong$
检查字符串大小,大于,小于号 要记得用转义符号\,比较测试,比较的是ASCII,所以大写字母小于小写字母。sort 命令排序小写字母会先出现
>或<不写转义符号,会当做重定向使用了。
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test9.sh baskball is less than hckey shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test9.sh #! /bin/bash val1=baskball val2=hckey if [ $val1 \> $val2 ] # 转义符号不要忘记 then echo "$val1 is greater than $val2" else echo "$val1 is less than $val2" fi shijianzhongdeMacBook-Pro:part_12 shijianzhong$
字符串大小的检查,-n,检查字符串是否有内容,有内容返回0 -z检查字符串是否为空,空返回0,不添加参数,自动检查是否有内容,有内容返回0,没有定义的变量,属于空
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ [ $abcd ] shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $? 1 shijianzhongdeMacBook-Pro:part_12 shijianzhong$ [ -z $abcd ] shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $? 0 shijianzhongdeMacBook-Pro:part_12 shijianzhong$ a="" shijianzhongdeMacBook-Pro:part_12 shijianzhong$ [ $a ] shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $? 1 shijianzhongdeMacBook-Pro:part_12 shijianzhong$
文件比较
Linux是一个万物皆文件的系统,if条件里面的一些参数可以测试文件的类型
除了-e 另外的前提是检查是否存在
-d file 检测文件是否为目录
-e 检查文件是否存在
-f 检查是否是一个文件
-r 检查是否是可读文件
-s 检查不为空的文件 (目录都为非空,只能检测文件)
-w 检测是否可读
-x 检测是否可执行
-O 检查并属当前用户所有
-G 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比 file2 新 (使用之前最好先检查文件是否存在)
file1 -ot file2 检查file1是否比file2 旧 (同上)
符合条件测试
&& and || or,这个跟其他编程差不多
if-then的高级特性
用于数学表达式的双括号(())
用于高级字符串处理功能的双方括号 [[]]
双括号 (( expression ))
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test23.sh The suqare of 10 is 100 shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test23.sh #! /bin/bash val1=10 if (( $val1 ** 2 > 90)) # >可以直接用在数学表达式,支持**幂运算 then (( val2=$val1 ** 2)) echo "The suqare of $val1 is $val2" fi shijianzhongdeMacBook-Pro:part_12 shijianzhong$
使用双方括号
双方括号命令提供了针对字符串的比较的高级特性。
[[ exprission ]]
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test24.sh hello shijianzhong shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test24.sh #! /bin/bash if [[ $USER == s* ]] # 双== ,通配模式 then echo "hello $USER" else echo "Sorry, I do not know you" fi shijianzhongdeMacBook-Pro:part_12 shijianzhong$
case命令
case与if比较一样
语法格式
case variable in
pattern1 | pattern2) command;;
pattern3)comands;;
*)commands;;
esac
抄写一个书中代码
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test26.sh Welcome shijianzhong Pleass enjoy you visit shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test26.sh #! /bin/bash case $USER in # 用关键字in shijianzhong | barbarna) # 多条件用| echo " Welcome $USER" echo "Pleass enjoy you visit";; testing) # 第二种情况 echo "Special testing account";; *) echo "Sorry, you are not allowed here";; esac shijianzhongdeMacBook-Pro:part_12 shijianzhong$ vim test26.sh shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test26.sh Sorry, you are not allowed here shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test26.sh #! /bin/bash case $USER in # 用关键字in hijianzhong | barbarna) # 多条件用| echo " Welcome $USER" echo "Pleass enjoy you visit";; testing) # 第二种情况 echo "Special testing account";; *) echo "Sorry, you are not allowed here";; esac shijianzhongdeMacBook-Pro:part_12 shijianzhong$
小结
学习了if then 扩展可以为 if then elif then else
if 条件下语句产生一个退出状态码为0执行,非0状态码为false不执行