上一节讲了分支语句,本节介绍shell中的循环语句。shell中循环语句主要是三种:一种是for语句,另一种是while语句,最后一种是until-do语句。
1. for语句
1.1 简单的for语句
利用for语句可以重复取出一个列表中的值,一次取一个,取完为止。建立脚本如下:
#/bin/bash
for item in Apple Boy Cake Dog Ege Fake;do
echo $item
done
运行结果如下:
Apple
Boy
Cake
Dog
Ege
Fake
1)注意:在C++中,如果我们写:
for (int i = 0; i < 5 ;i++) {
cout << i;
}
cout << i;
会编译出错,因为第二个cout << i时是访问不了i这个变量了,i的生命周期只存在于for循环里面。但是,shell脚本不一样,在for的外面仍然可以访问,比如上面这个脚本item在for结束后一直存着的都是Fake这个值。
2)注意: 当列表中存在单引号的时候,两个单引号之间的内容会被当成一个整体,比如有一个脚本如下:
#/bin/bash
for item in Timmy hasn't ate Lucy's cake;do
echo $item
done
运行结果如下:
Timmy
hasnt ate Lucys
cake
这个与预期的结果不一样。解决的方法有两个,第一个是在单引号前面增加转移符号(\),第二种方法是使用双引号把包含单引号的整个单词框起来,当在一个单词的两边加上双引号时,双引号本身不会被当前单词的一部分。分别建立脚本如下:
增加转义的脚本:
#/bin/bash
for item in Timmy hasn\'t ate Lucy\'s cake;do
echo $item
done
使用双引号的脚本:
#/bin/bash
for item in Timmy "hasn't" ate "Lucy's" cake;do
echo $item
done
两个脚本的运行结果相同,都为:
Timmy
hasn't
ate
Lucy's
cake
3)注意:for默认根据空格来分割列表,所以如果列表中有不想被分割的空格,那么就用双引号包起来,举例如下:
#/bin/bash
for item in "Ji Gong" "Wu Lin Wai Zhuan";do
echo $item
done
运行结果如下:
Ji Gong
Wu Lin Wai Zhuan
4) 注意: m默认情况下,字符串以空格,制表符和换行符作为分隔符。比如说,我们现在从文件中用for去读取字符串,举例如下,首先建立一个文件testfile,内容为:
wu lin wai zhuan
di xia jiao tong zhan
da ran fang
然后建立脚本,这次从testfile文件中去读数据,脚本如下:
#/bin/bash
for item in $(cat testfile);do
echo $item
done
运行后结果如下:
wu
lin
wai
zhuan
di
xia
jiao
tong
zhan
da
ran
fang
这里把testfile中的换行和空格都当作分割符了,有时候我们需要自己指定分隔符。这个时候我们只要改变环境变量IFS的值就可以了,IFS是内部字段分隔符,比如只以换行符对testfile进行分割,建立脚本如下:
#/bin/bash
IFS_old=$IFS
IFS=$'\n'
for item in $(cat testfile);do
echo $item
done
IFS=$IFS_old
运行结果如下:
wu lin wai zhuan
di xia jiao tong zhan
da ran fang
这里设置之前备份了一下IFS的值,用完之后又还原回来。
1.2 for语句读取文件夹
用for语句循环读取一个文件夹中的每个文件和文件夹,举例如下:
#/bin/bash
for item in /home/script/* /bin/*;do
echo "$item"
done
运行如下:
/home/script/1
/home/script/test
/home/script/test1.sh
/bin/bash
1.3 shell中类似C语言的for语句
shell可以像C语言那样写for循环,举例如下:
#/bin/bash
for (( i = 1,j=3; i<=3 && j > 0; i++,j--));do
echo "$i * $j = $[$i * $j]"
done
运行结果如下:
1 * 3 = 3
2 * 2 = 4
3 * 1 = 3
注意:这里的风格和C语言很像,只不过使用的是两个小括号。其中,变量取值不用加美元符号,并且赋初值的时候可以有空格,也可以不加空格,判断的时候也可以加空格或者不加空格。
2. while语句
while判断条件是否成立,若成立则进入while的分支,举例如下:
#/bin/bash
var1=1
var2=4
while [ $var1 -lt 3 ] && [ $var2 -gt 0 ];do
echo "$var1 * $var2 = $[$var1 * $var2]"
var1=$[$var1 + 1]
var2=$[$var2 - 1]
done
运行结果为:
1 * 4 = 4
2 * 3 = 6
3. until-do语句
until语句的逻辑与while相反,while当条件判断成功时进入循环,until判断条件失败时进入,举例如下:
#/bin/bash
var=0
until [ $var -gt 3 ];do
echo "var=$var"
var=$[$var + 1]
done
运行结果如下:
var=0
var=1
var=2
var=3
4. 循环语句中使用break和continue
4.1 break语句
break语句用于跳出当前层的循环,举例如下:
#/bin/bash
for ((i=0; i<2;i++));do
for ((j=0;j<5;j++));do
echo "i=$i,j=$j"
if [ $j -eq 2 ];then
break
fi
done
done
运行如下:
i=0,j=0
i=0,j=1
i=0,j=2chuli
i=1,j=0
i=1,j=1
i=1,j=2
注意:break只能跳出当前层的循环,上面这个例子有两层循环的嵌套,那么当内层的break执行的时候只能跳出内层。
如果想要跳出多层循环,可以使用break n,举例如下:
#/bin/bash
for ((i=0; i<2;i++));do
for ((j=0;j<5;j++));do
echo "i=$i,j=$j"
if [ $j -eq 2 ];then
break 2
fi
done
done
运行结果如下:
i=0,j=0
i=0,j=1
i=0,j=2
zenmxie4.2 continue语句
continue语句用于终止本次循环,即本次循环中continue后面的代码不执行,进行下一次循环的入口判断,举例如下:
#/bin/bash
for ((i=0; i<5;i++ ))
do
if [ $i -lt 3 ];then
continue
fi
echo "i = $i"
done
运行结果如下:
i = 3
i = 4
cotinue语句和break一样,也可以用continue n
5. 总结与展望
5.1总结
3(1)如何写简单的for语句读取列表,列表中如有有单引号怎么处理;
(2) for中对列表分隔符的使用和替换;
(3) for语句读取文件夹,C++风格的shell for语句怎么写;
(4) while语句怎么写;
(5)until-do语句怎么写,until与while判断方式正好相反;
(6)循环语句中使用break和continue。
5.2 展望
下次更新将学习使用shell中的输入和输出。