首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Shell脚本根本流程控制语句总结

2012-12-22 
Shell脚本基本流程控制语句总结通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行

Shell脚本基本流程控制语句总结
通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行更复杂的逻辑判断,我们就需要流程控制语句来支持。现在我就总结一下shell流程控制语句语法以及常用形式(我一直觉得没有必要什么都学,而是用自己擅长的方式去解决所有遇到的问题)

1.if条件

if 条件; then#statements1else#statements2fi

这里的条件通常是一个命令,当命令的退出状态码返回0,表示条件为真,这时候执行statements1,否则执行statements2

我们看一个例子(判断字符串中是否包含指定字符):

str="hello world";if echo "$str" | grep -q "ll" ; then   #grep 中的-q参数表示silent模式--禁止输出echo "$str contains ll"elseecho "$str doesn't contain ll"fi

我们看下执行结果:


[ ]命令通常是if语句中最常用的命令(条件测试命令),我们使用它可以做一些文件,字符串或者是数值的判断,下面我们看一个例子:

if [ -e "/etc/passwd" ]; thensize=`ls -l -h /etc/passwd | awk '{print $5}'`echo "/etc/passwd file is exised, and it's size is $size"fistr1="nanjing"str2="beijing"if [ "$str1" = "$str2" ]; thenecho "$str1 equals to $str2"elseecho "$str1 doesn't equals to $str2"finum1=100num2=105if [ "$num1" -gt "$num2" ]; thenecho "$num1 is greater than $num2"elseecho "$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   #两边没有括号,请记住#statementsdone

在循环的每次执行中, i将顺序的访问列表中列出的变量,我们看一个例子

city="nanjing shanghai hangzhou beijing"for city in $city; doecho $citydone

执行结果如图:


日常生活中,我们通常会有遍历某个目录下所有文件的需求,我们可以这样做
for file in `ls`; doecho $filedone

或者

for file in *; doecho $filedone

运行结果如图:


如果我们只是希望简单的控制循环次数,我们可以使用下面这种形式

for i in $(seq 5); do   #个人更喜欢这种形式,$(...)是bash的变量替换echo $idone

如果你是一个C程序员,我想下面的形式,你会更加喜欢:

for (( i = 0; i < 10; i++ )); do#statementsdone

使用这种格式的for循环,在(( ))中引用的shell变量不需要使用$,eg:

LIMIT=10for (( i = 0; i < LIMIT; i++ )); doecho $idone

注意,我在ubuntu12.04运行这个脚本的时候,出现了Bad for loop variable错误,解决方法也很简单:http://blog.sina.com.cn/s/blog_985bedb401015vrl.html


3.while循环
while 条件; do#statementsdone

同if条件语句一样,这里的条件通常是一个命令,当命令的退出状态码返回0,表示条件为真,这时候执行statements,直到条件为假(命令返回非0)

while循环我用的比较少,通常是用来循环读取一个一个文件

cat $file | while read line ; doecho $linedone



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 $aa=$(( a++ ))echo $aa=$(( 100 / 3 ))echo $aa=$(( 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

热点排行