1.if条件
if 条件; then #statements1 else #statements2 fi
这里的条件通常是一个命令, 当命令的退出状态码返回0,表示条件为真,这时候执行statements1,否则执行statements2
我们看一个例子(判断字符串中是否包含指定字符):
str="hello world"; if echo "$str" | grep -q "ll" ; then #grep 中的-q参数表示silent模式--禁止输出 echo "$str contains ll" else echo "$str doesn't contain ll" fi
我们看下执行结果:
[ ]命令通常是if语句中最常用的命令(条件测试命令),我们使用它可以做一些文件,字符串或者是数值的判断,下面我们看一个例子:
if [ -e "/etc/passwd" ]; then size=`ls -l -h /etc/passwd | awk '{print $5}'` echo "/etc/passwd file is exised, and it's size is $size" fi str1="nanjing" str2="beijing" if [ "$str1" = "$str2" ]; then echo "$str1 equals to $str2" else echo "$str1 doesn't equals to $str2" fi num1=100 num2=105 if [ "$num1" -gt "$num2" ]; then echo "$num1 is greater than $num2" else echo "$num1 is not greater than $num2" fi
执行结果如图:
关于[ ]命令(实际上就是test命令的另一种形式)更多参数说明,可以参看我之前写的一篇文章: http://diaocow.iteye.com/blog/1629868
另外还有一点需要补充的是:
1. test, [ ], /usr/bin/test, 和 /usr/bin/[ 都是等价命令;
2. 其中test 和 [ ] 是bash的内建命令,而/usr/bin/test 和 /usr/bin/[ 是一个外部命令;
3. 在Bash脚本中, test命令不会调用外部的/usr/bin/test命令, 它调用的是sh-utils工具包中内建test命令. 同样的, [ 也并不会调用 /usr/bin/[
2.for循环
通常for循环有3种常用的形式:
for i in 列表; do #两边没有括号,请记住 #statements done
在循环的每次执行中, i将顺序的访问列表中列出的变量,我们看一个例子
city="nanjing shanghai hangzhou beijing" for city in $city; do echo $city done
执行结果如图:
日常生活中,我们通常会有遍历某个目录下所有文件的需求,我们可以这样做
for file in `ls`; do echo $file done
或者
for file in *; do echo $file done
运行结果如图:
如果我们只是希望简单的控制循环次数,我们可以使用下面这种形式
for i in $(seq 5); do #个人更喜欢这种形式,$(...)是bash的变量替换 echo $i done
如果你是一个C程序员,我想下面的形式,你会更加喜欢:
for (( i = 0; i < 10; i++ )); do #statements done
使用这种格式的for循环,在(( ))中引用的shell变量不需要使用$,eg:
LIMIT=10 for (( i = 0; i < LIMIT; i++ )); do echo $i done
注意,我在ubuntu12.04运行这个脚本的时候,出现了Bad for loop variable错误,解决方法也很简单: http://blog.sina.com.cn/s/blog_985bedb401015vrl.html
3.while循环
while 条件; do #statements done
同if条件语句一样,这里的条件通常是一个命令,当命令的退出状态码返回0,表示条件为真,这时候执行statements,直到条件为假(命令返回非0)
while循环我用的比较少,通常是用来循环读取一个一个文件
cat $file | while read line ; do echo $line done
4.[[ ]] 与 (( ))
[[ ]] 是一个扩展命令(bash内建命令),它基本上与[ ]用法一致,并且更强大也更符合程序员的使用习惯;
a.当我们使用[ ]来测试两个并列条件,我们有两种做法:[ 条件1 -a 条件2 ] 或者 [ 条件1 ] && [ 条件2 ] 但使用[[]]我们可以这样做:[[ 条件1 && 条件2 ]]
b.[[ ]] 支持更多的操作符(不许要额外的转义并且语法上更符合一般的程序设计语言),譬如比较数字[ ]中使用的是类似-eq, -gt等操作符,而[[ ]]直接支持>, <等操作符更详细的文档说明: http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/comparison-ops.html
(( ))是 一个算术运算命令(不是一个真的命令,感觉像是一个bash关键字),有了它, 我们基本可以废弃expr命令的使用,并且大大提高了脚本的执行效率,我们具体看几个例子(它的语法和C语言很像):
a=$(( 100 + 1 )) echo $a a=$(( a++ )) echo $a a=$(( 100 / 3 )) echo $a a=$(( 100 * 2 )) echo $a
我们看下执行结果:
似乎有一个不成文的约定,字符串比较使用[[ ]] ,数值比较使用(( ))
5.学习资料
高级Bash脚本编程指南(这几天我突然发现原先的在线版连接已经不可用了,现附上另一个:http://leedd.com/html/abs-3.9.1/)
http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/tests.html
http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/loops.html
由于文档中的代码都携带行号,所以复制完后又要一个个删除,很是麻烦,于是我写了个命令,这样就简单多了:
sed -i 's/ *[0-9][0-9]* //' test.sh