`
DiaoCow
  • 浏览: 241396 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

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

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
  • 大小: 9.6 KB
  • 大小: 19.3 KB
  • 大小: 14.3 KB
  • 大小: 11.6 KB
  • 大小: 14.7 KB
  • 大小: 9.1 KB
  • 大小: 36.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics