上一节讲了分支语句,本节介绍shell中的循环语句。shell中循环语句主要是三种:
- for语句
- while语句
- until-do语句
利用for语句,可以重复取出一个列表中的值,一次取一个,取完为止。建立脚本如下:
#/bin/bash
for item in Apple Boy Cake Dog Ege Fake;do
echo $item
done
运行结果如下:
Apple
Boy
Cake
Dog
Ege
Fake
注意:在C++中,如果我们写:
for (int i = 0; i < 5 ;i++) {
cout << i;
}
cout << i;
会编译出错,因为第二个cout << i是访问不了i这个变量了,i的生命周期只存在for循环里面。但是,shell脚本不一样,在for的外面仍然可以访问。比如上面这个脚本,item在for结束后一直存着的都是Fake这个值。
当列表中存在单引号的时候,两个单引号之间的内容会被当成一个整体。比如有一个脚本如下:
#/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
for默认根据空格来分割列表,所以如果列表中有不想被分割的空格,那么就用双引号包起来,举例如下:
#/bin/bash
for item in "Ji Gong" "Wu Lin Wai Zhuan";do
echo $item
done
运行结果如下:
Ji Gong
Wu Lin Wai Zhuan
在默认情况下,字符串以空格,制表符和换行符作为分隔符。比如说,我们现在从文件中用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的值,用完之后又还原回来。
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
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语言很像,只不过使用的是两个小括号。其中,变量取值不用加美元符号,并且赋初值的时候可以有空格,也可以不加空格,判断的时候也可以加空格或者不加空格。