上篇,这篇主要写下这本书中有关结构化编程的一些东西。

首先讲的是if条件判断,基本格式如下:

if command #command表示测试性的语句
then

commands #需要执行的命令
elif command
commands #需要执行的命令
else
commands #需要执行的命令
fi

不过我更喜欢的写法是在if command后面加上一个”;”然后把then写在第一行,这样主要是习惯问题

判断的语句可以用一些命令来判断,如果命令执行成功的话就相当于判断成功,这里用的就是前面讲的命令执行后的退出码[成功的话会返回0,否则是一个1-255的值]。

然后接下来就是所谓的test命令,test命令格式很简单

test condition
[ condition ]

上面的两个都行,不过貌似大部分选的是第二种,但是第二种一定要注意,’[‘这condition之间,condition和’]’之间一定要有空格,不然会报错。

然后数值比较有

n1 -eq n2 n1是否等于n2 n1 -le n2 n1是否小于或等于n2
n1 -ge n2 n1是否大于或等于n2 n1 -lt n2 n1是否小于n2
n1 -gt n2 n1是否大于n2 n1 -ne n2 n1是否不等于n2

字符串比较有

str1 = str2 str1与str2是否相同 str1 > str2 str1是否大于str2
str1 != str2 str1与str2是否不同 -n str1 str1的长度是否大于0
str1 < str2 str1是否小于str2 -z str1 str1的长度是否为0

文件判断有

-d file 检查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 [ $var1 > $var2 ]; then
echo “$var1 is greater than $var2”
else
echo “$var1 is less than $var2”

如果在判读的时候不用转义的话,那么就会编程重定向到$var2

接下来就是符合条件的检查了,也就是 AND和OR,格式如下

[ condition1 ] & [ condition2 ]
[ condition1 ] || [ condition2 ]

另外就是用双圆括号来使用高级数学公式,比如var++等。if (( $var ** 2 > 90 )) 表示var的平方是否大于90。

接下来就是case命令了,下面是格式

case varable in
pattern1 | pattern2 ) commands1; #表示两个随便一个满足就行
pattern3) commands; #表示满足pattern3
*) default commands; #除了上面的情况之外的所有情况
esac #一定要加这个结束表示

下面是for的介绍,基本格式为

for var in list
do
commands
done

如果list中有单引号的话,那么要用转义字符把单引号给转义掉,或者使用双引号来包住整个list,例子如下

for test in I don\’t know if “this’ll” work
do
echo “word:$test”
done

还有如果list中有空格的话,也许要用双引号包起来。在bash中是把空格制表符换行符当成分隔符的不过可以用IFS来设置,比如用”IFS=$’\n’”设置成只有换行符是分隔符,当然还可以使用通配符来生成list,比如”for file in /home/*”.接下来还可以使用和C风格类似的for语句,不过在shell里面写,会觉得很怪

接下来是while的登场了,基本格式如下

while test command
do
other commands
done

还有就是until了,基本格式为

until test commands
do
other commands
done

接下来就是循环的嵌套和跳出了,嵌套没啥好讲的,跳出的话还可以比较给力的,主要是可以跳出多层循环,比如break 2就是跳出倒数第二层循环,continue 2会停止当前的循环,继续倒数第二层循环。

最后可以在所有的结构化语句结束处用一个重定向语句就可以把这个结构里面的所有输出进行重定向。

Comments