Shell脚本编程之结构化命令
2016/06/10
一 if语句
1. if-then语句格式,有两种
第一种:
第二种:
2.if-then-else语句格式
3.嵌套if
4.test 命令
格式:test condition
if-then语句中声明test命令的方法:
注意:你必须在左括号右侧和右括号左侧各加一个空格,否则会报错。
test命令可以判断3类条件:
a 数值比较
b 字符串比较
c 文件比较
4.1 数值比较
![images\10-1.png]()
![](https://img-blog.csdn.net/20160918093207639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
4.2 字符串比较
![images\10-2.png]()
![](https://img-blog.csdn.net/20160918093222905?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
大于或小于号在比较时必须经过转义
![](https://img-blog.csdn.net/20160918093243356?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![images\10-3.png]()
4.3 文件比较
![images\10-4.png]()
![](https://img-blog.csdn.net/20160918093259810?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
5. if-then复合条件测试
if-then语句允许你使用布尔逻辑来组合测试:
a [ condition1 ] && [ condition2 ]
b [ condition1 ] || [ condition2 ]
6. if-then的高级特性
a 用于数学表达式的双尖括号
b 用于高级字符串处理 功能的双方括号
双尖括号命令的格式:(( expression ))
双尖括号命令符号:
![images\10-5.png]()
![](https://img-blog.csdn.net/20160918093326718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
双方括号:[[ expression ]]
7. case命令
格式如下:
case命令会将指定的变量同不同的模式进行比较。如果变量和模式是匹配的,那么shell会执行为该模式指定的命令。
二 循环执行一组命令直至达到了某个特定条件,shell循环命令:for, while和until
1 for命令
重复执行一组命令直至达到某个特定条件,比如处理某个目录下的所有文件,系统上的所有用户或是某个文本文件中的所有行。
for命令的基本格式:
或
在list参数中,你提供了迭代中要用的一系列值,在每个迭代中,变量var会包含列表中的当前值。第一个迭代会使用列表中的第一个值,第二个迭代使用第二个值,以此类推,直到列表中的所有值都过一遍。$var变量包含着这次迭代对应的当前那个列表中的值。
![images\10-6.png]()
输出的结果并不是我们想要的,如果解决这个问题呢,有两个办法:
a 使用转移字符(反斜线)来将单引号转义
b 使用双引号来定义用到单引号的值
![images\10-7.png]()
![](https://img-blog.csdn.net/20160918093438000?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![images\10-8.png]()
1.2 更改字段分隔符
环境变量IFS称为内部字段分隔符,默认情况下,bash shell会将空格,制表符,换行符当作字段分割符。
1.3 用通配符读取目录
这个特性在处理目录中的文件而你不知道所有的文件名时非常有用
![images\10-9.png]()
![](https://img-blog.csdn.net/20160918093526422?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注意,在这个例子中,我们和if语句里的测试处理得有些不同:
if [ -d "$file" ]
在Linux中,目录名和文件名中包含空格当然是合法的,要容纳这种值,你应该用双引号将$file圈起来 ,如果不那么做,遇到含有空格的目录名或文件名时会有错误产生。
一 if语句
1. if-then语句格式,有两种
第一种:
if command
then
commands
fi
then
commands
fi
第二种:
if command; then
commands
fi
commands
fi
2.if-then-else语句格式
if command
then
commands
else
commands
fi
then
commands
else
commands
fi
3.嵌套if
if command1
then
commands
elif command2
then
more commands
fi
then
commands
elif command2
then
more commands
fi
4.test 命令
格式:test condition
if-then语句中声明test命令的方法:
if [ condition ]
then
commands
fi
then
commands
fi
注意:你必须在左括号右侧和右括号左侧各加一个空格,否则会报错。
test命令可以判断3类条件:
a 数值比较
b 字符串比较
c 文件比较
4.1 数值比较
4.2 字符串比较
大于或小于号在比较时必须经过转义
4.3 文件比较
5. if-then复合条件测试
if-then语句允许你使用布尔逻辑来组合测试:
a [ condition1 ] && [ condition2 ]
b [ condition1 ] || [ condition2 ]
6. if-then的高级特性
a 用于数学表达式的双尖括号
b 用于高级字符串处理 功能的双方括号
双尖括号命令的格式:(( expression ))
双尖括号命令符号:
双方括号:[[ expression ]]
7. case命令
格式如下:
case variable in
pattern1 | pattern2) command1;;
pattern3) command2;;
*) default command;;
esac
pattern1 | pattern2) command1;;
pattern3) command2;;
*) default command;;
esac
case命令会将指定的变量同不同的模式进行比较。如果变量和模式是匹配的,那么shell会执行为该模式指定的命令。
二 循环执行一组命令直至达到了某个特定条件,shell循环命令:for, while和until
1 for命令
重复执行一组命令直至达到某个特定条件,比如处理某个目录下的所有文件,系统上的所有用户或是某个文本文件中的所有行。
for命令的基本格式:
for var in list
do
commands
done
do
commands
done
或
for var in list; do
在list参数中,你提供了迭代中要用的一系列值,在每个迭代中,变量var会包含列表中的当前值。第一个迭代会使用列表中的第一个值,第二个迭代使用第二个值,以此类推,直到列表中的所有值都过一遍。$var变量包含着这次迭代对应的当前那个列表中的值。
看个例子:
输出的结果并不是我们想要的,如果解决这个问题呢,有两个办法:
a 使用转移字符(反斜线)来将单引号转义
b 使用双引号来定义用到单引号的值
1.1 从变量读取列表
1.2 更改字段分隔符
环境变量IFS称为内部字段分隔符,默认情况下,bash shell会将空格,制表符,换行符当作字段分割符。
1.3 用通配符读取目录
这个特性在处理目录中的文件而你不知道所有的文件名时非常有用
注意,在这个例子中,我们和if语句里的测试处理得有些不同:
if [ -d "$file" ]
在Linux中,目录名和文件名中包含空格当然是合法的,要容纳这种值,你应该用双引号将$file圈起来 ,如果不那么做,遇到含有空格的目录名或文件名时会有错误产生。