从零开始学shell之结构化命令
一、前言
在shell脚本中我们会需要控制程序的走向或者根据条件使脚本跳过某些指令。这样的命令通常称为结构化命令。
二、结构化命令
2.1 if-then语句
if command
then
command
fi
bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码是0(该命令成功运行) ,位于then部分的命令就会被执行。如果该命令的退出状态码是其他值, then在部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。fi语句用来表示if-then语句到此结束。
例子:
#!/bin/bash
# testing the if statement
if pwd
then
echo "It worked"
fi
如果pwd运行成功了,那么就会打印出 It worked。
if-then语句的另一种形式:
if command; then
commands
fi
if-then-else语句
if-then-else语句,提供了命令不返回0时的另一种选择。
if command
then
commands
else
commands
fi
例子:
#!/bin/bash
# testing the else section
#
testuser=NoSuchUser
#
if grep $testuser /etc/passwd
then
echo "The bash files for user $testuser are:"
ls -a /home/$testuser/.b*
echo
else
echo "The user $testuser does not exist on this system."
echo
fi
嵌套if和elif
我们可以再if-then中嵌套使用if。但是这样会让shell的可读性降低。可以使用else部分的另一种形式:elif。这样就不用再书写多个if-then语句了。
if command1
then
commands
elif command2
then
more commands
fi
Ps: 在elif语句中,紧跟其后的else语句属于elif代码块。它们并不属于之前的
if-then代码块。
test命令
想要在if-then中实现类似编程语言的if语句,需要借助test命令。
test命令格式:
test condition
在if-then中使用:
if test condition
then
commands
fi
bash shell提供了另一种条件测试方法,无需在if-then语句中声明test命令
if [ condition ]
then
commands
fi
ps: condition和两个中括号之间要用空格隔开,否则会报错。
test命令可以判断三类条件:
- 数值比较
- 字符串比较
- 文件比较
数值比较
test命令常见的是对两个数值进行比较。下面列出了可用的条件参数。
参数 | 描述 |
---|---|
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大 |
ps:大于号和小于号必须转义,否则shell会把他们当作重定向符号,把字符串当作文件名。
ps:我们经常会遇到判断变量是否正确赋值的情况。可以通过-n和-z条件参数来进行判断
参数 | 描述 |
---|---|
-n var | 变量长度为非0时 true,为0时 false |
-z var | 变量长度为0时 true 非0时 false。未定义变量的长度默认为0 |
ps: | |
-n的格式 [ -n "$var" ] | |
-z的格式 [ -z $var ] | |
-n比较的时候需要加上双引号才行 |
文件比较
文件比较是shell编程中用的最多的,最为强大的形式。
参数 | 描述 |
---|---|
-d file | 检查file是否存在并是一个目录 |
-e file | 检查file是否存在,也就是检查file代表的目录或文件是否存在 |
-f file | 检查file是否存在并是一个文件 |
-r file | 检查file是否存在并可读 |
-s file | 检查file是否存在并非空 |
-w file | 检查file是否存在并可写 |
-O file | 检查file是否存在并属于当前用户所有 |
-G file | 检查file是否存在并且默认组与当前用户相同 |
file1 -nt file2 | 检查file1是否比file2新 |
file1 -ot file2 | 检查file1是否比file2旧 |
复合条件测试
if-then语句允许你使用布尔逻辑用来组合测试。有两种布尔运算符可用:
- [condition1] && [condition2]
- [condition1] || [condition2]
第一种是And布尔运算符,必须两个条件都满足才能继续执行then部分命令。
第二种是Or布尔运算符,两个里面只要有一个满足条件就可以继续执行then部分命令。
case命令
case命令的格式:
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
使用case命令提供了一个更清晰的方法来为变量每个可能的值指定不同的选项。
总结
这次总结了shell的简单结构化命令,下次学习for,while,until等结构化命令。