12结构化命令

正确的顺序执行。然而,并不是全部程序都如此操做。
许多程序要求对shell脚本中的命令施加一些逻辑流程控制。有一类命令会根据条件使脚本跳过某些命令。这样的命令一般称为结构化命令(structured command)。程序员

12 if-thenshell

最基本的结构化命令就是if-then语句。if-then语句有以下格式。
if command
then
commands
fiexpress

bash shell的if语句会运行if后面的那个命令。若是该命令的退出状态码(参见第11章)是0(该命令成功运行),位于then部分的命令就会被执行。若是该命令的退出状态码是其余值, then部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。 fi语句用来表示if-then语句到此结束。编程

若是你在用其余编程语言的if-then语句,这种形式可能会让你有点困惑。在其余编程语言中, if语句以后的对象是一个等式,这个等式的求值结果为TRUE 或FALSE。但bash shell的if语句并非这么作的。安全

test命令提供了在if-then语句中测试不一样条件的途径。
若是test命令中列出的条件成立,test命令就会退出并返回退出状态码0。这样if-then语句就与其余编程语言中的if-then 语句以相似的方式工做了。
若是条件不成立,test命令就会退出并返回非零的退出状态码,这使得
if-then语句不会再被执行。
--应该是适用于某些特殊状况,通常而言这命令多余bash

test命令的格式很是简单。
test condition编程语言

bash shell提供了另外一种条件测试方法,无需在if-then语句中声明test命令。
if [ condition ]
then
commands
fi
方括号定义了测试条件。
注意,第一个方括号以后和第二个方括号以前必须加上一个空格,不然就会报错。
test命令能够判断三类条件:
 数值比较
 字符串比较
 文件比较ide

test命令和测试表达式使用标准的数学比较符号来表示字符串比较,而用文本代码来表示数值比较。这个细微的特性被不少程序员理解反了。若是你对数值使用了数学运算符号,shell会将它们当成字符串值,可能没法获得正确的结果。测试

-d file 检查file是否存在并是一个目录
-e file 检查file是否存在
-f file 检查file是否存在并是一个文件命令行

bash shell提供了两项可在if-then语句中使用的高级特性:
 用于数学表达式的双括号
 用于高级字符串处理功能的双方括号

双括号命令的格式以下:
(( expression ))

&& 逻辑和
|| 逻辑或
! 逻辑求反

双方括号命令的格式以下:
[[ expression ]]

说明 双方括号在bash shell中工做良好。不过要当心,不是全部的shell都支持双方括号。

有了case命令,就不须要再写出全部的elif语句来不停地检查同一个变量的值了。 case命令会采用列表格式来检查单个变量的多个值。
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac

--比较数值用 -eq -lt -gt, 单方括号
比较字符串用 = \> \< ,单圆括号
双圆括号可进行数学运算,双方括号用==进行字符串比较,也不知道是不是只适用于if-then。

case比较字符串用in,for也是用in
真是奇怪,每一个规则都不同

13 for

for var in list
do
commands
done

注意默认以空格区分变量列表,echo $IFS

变量拼接的方法

一个可参考的安全实践是在改变IFS 以前保存原来的IFS值,以后再恢复它。这种技术能够这样实现:
IFS.OLD=$IFS
IFS=$'\n'
<在代码中使用新的IFS值>
IFS=$IFS.OLD
这就保证了在脚本的后续操做中使用的是IFS的默认值。

若是要指定多个IFS字符,只要将它们在赋值行串起来就行。
IFS=$'\n':;"
这个赋值会将换行符、冒号、分号和双引号做为字段分隔符。如何使用IFS字符解析数据没有任何限制。

13.3 while

while命令某种意义上是if-then语句和for循环的混杂体。 while命令容许定义一个要测试的命令,而后循环执行一组命令,只要定义的测试命令返回的是退出状态码0。它会在每次迭代的一开始测试test命令。在test 命令返回非零退出状态码时,while命令会中止执行那组命令。

while命令的格式是:
while test command
do
other commands
done

13.4 until
until命令和while命令工做的方式彻底相反。

13.5 嵌套循环

13.7 控制循环
你可能会想,一旦启动了循环,就必须苦等到循环完成全部的迭代。并非这样的。有两个命令能帮咱们控制循环内部的状况:
 break命令
 continue命令

有时你在内部循环,但须要中止外部循环。break命令接受单个命令行参数值:
break n

和break命令同样,continue命令也容许经过命令行参数指定要继续执行哪一级循环:
continue n

done > output.txt
shell会将 for命令的结果重定向到文件output.txt中,而不是显示在屏幕上。

done | sort
这种方法一样适用于将循环的结果管接给另外一个命令。

要读取文件中的数据,得用上一点shell脚本编程技巧。咱们将IFS分隔符设置成逗号,并将
其放入while语句的条件测试部分。而后使用read命令读取文件中的各行。实现代码以下:
while IFS=’,’ read –r userid name
read命令会自动读取.csv文本文件的下一行内容,因此不须要专门再写一个循环来处理。

$ cat test26
#!/bin/bash

input="users.csv"while IFS=',' read -r userid namedoecho "adding $userid"useradd -c "$name" -m $useriddone < "$input"$