结构化命令
在上一篇我们写了第一个shell脚本中,shell命令都是按照出现的顺序来处理shell脚本中的每个命令。虽然在一些顺序的操作来说这已经能够实现了,但是我们要想把所有的命令都按照正确的顺序去执行。比如能够像我们写一些程序代码一样有逻辑控制,那么我们就使用结构化命令去实现shell脚本中的逻辑控制
if-then语句
- if-then语句的格式:
if command then commands fi
-
if-then在我们学编程语言用的if语句相似,但是却不同,编程语言中的if语句后面是判断语句是ture或false,而if-then后面是跟命令,如果if后面的命令执行了那么then部分的命令才会执行。
-
例子:if后面的脚本能运行
if date then echo "it worked " fi
结果是:
2018年 10月 28日 星期日 21:55:15 CST
it worked这里的脚本创建和之前一样
-
例子:if后面的命令不能允许
#!/bin/bash #testing a bad command if asdfg then echo "it did not work" fi echo "we are outside of the if statement"
结果是:
./test7: line 5: asdfg: command not found
we are outside of the if statement
if-then-else 语句
- if-then-else 语句就像我们编程语言中的if-else,
if command then commands else commands fi
if后面的命令不能运行那么就跳到else部分的去执行命令
-
例子:
#!/bin/bash # testing the else section testuser=baduser if grep $testuser /etc/passwd then echo The files for user $testuser are: ls -a /home/$testuser/.b* else echo "The user name $testuser does not exist on this system " fi
结果:
The user name baduser does not exist on this system
这里由于我的用户名不是baduser所以if后面的命令返回的不是0状态码,命令成功工作就会返回一个0状态码
嵌套的if语句
- 当我们需要检查脚本中的多种条件时,我们一般使用嵌套if语句。其实就是和我们编程语言中的嵌套if语句的思想和用法是一样的
- 嵌套if语句的格式:
if command1 then commands if command2 then commands if command3 then commands . . . . . fi
例子这里就不举例了,因为有编程语言基础的人都会理解怎么区使用了。
test 命令
在上面的if-then语句中,if成立与后面的命令是否正确工作即是返回u的状态码是0。这里的test命令提供了不同的测试条件途径。
- test命令的原理:test命令中的条件成立就返回0,否则就返回1
- if-then语句加上test命令 = 我们编程语言中的if语句
- 命令格式:
if test condition then commands fi
或
if [condition] then commands fi
test命令可以判断的3类:
-
数值比较
-
字符串比较
-
文件比较
数值比较
比较 | 描述 |
---|---|
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 |
字符串比较
比较 | 描述 |
---|---|
str1 = str2 |
检查str1是否和str2相同 |
str1 != str2 | 检查str1是否和str2不相同 |
str1 < str2 | 检查str1是否比str2小(字符串的长度大小) |
str1 >str2 | 检查str1是否比str2大(字符串的长度大小) |
-n str1 | 检查str1的长度是否非0 |
-z str1 |
检查str1的长度是否为0 |
文件比较
比较 | 描述 |
---|---|
-d fie | 检查file是否存在并是一个目录 |
-e file | 检查file是否存在 |
-f file | 检查file是否存在并是一个文件 |
-r file | 检查file是否存在并可读 |
-s file | 检查file是否存在并非空 |
-w file | 检查file是否存在并可写 |
-x file | 检查file是否存在并可执行 |
-O file | 检查file是否存在并属于当前用户所有 |
-G file | 检查file是组否存在并且默认组与当前用户相同 |
file1 -nt file2 | 检查file1是否比file2更新 |
file1 -ot file2 | 检查file1是否比file2旧 |
符合条件
if-then语句允许使用布尔逻辑来组成测试:
- [ conditon1 ] && [ condition2 ]
- [ condition1 ] || [ condition2 ]
if-then 的高级特性
- 使用双圆括号:在使用双圆括号里面的数值计算与比较与编程语言中的一切常用的数值计算一样。
- 命令格式:
((expression))
-
与if-then使用,命令格式:
#!/bin/bash # using double parenthesis var1 = 28 if (( $var1*2 <100)) then echo if be running var1= $var1 else echo var1 < 100 var1= $var1 fi
case 命令
如果我们要使用很多的判断语句用if-th就很罗嗦,如果使用case命令就显得很简洁。case命令与我们常用的编程语言中的case语句用法一样,不过有所差别。
- case命令格式:
case variable in pattern1 | pattern2 ) commands1;; pattern2 ) commands2;; pattern3 ) commands3;; . . . . * ) commands;; esac
就是判断变量与不同的模式比较,上面中的*是所有的条件都不满足才执行后面的命令
-
case命令与if-then命令比较:
# if命令 #!/bin/bash # using if cammand testing if [ $UER = "denis" ] then echo "welcome $UER " echo "Please enjoy your visit “ if [$UER = "barbared" ] then echo "welcome $UER " echo "Please enjoy your visit “ if [$UER = "testing" ] then echo "Special testing account “ if [$UER = "jessica" ] then echo "Do not forget to logout when you're done “ else echo "Sorry, you are not allowed here" fi
# case 命令 #!/bin/bash # using the case command case $UER in rich | barbara ) echo "welconme, $UER" echo "Please enjoy your visit :";; testing ) echo "Special testing account";; jessica ) echo "Do not forget to log off when you're done";; * ) echo "Sorry, you are not allowed here ";; esac
显而易见,他们的思想与我们常用的编程语言中的if 与case语句用法一样只是表达有点不差别而以。