shell脚本for循环执行命令行(为什么shell脚本中for循环没执行)(1)

上一节讲了分支语句,本节介绍shell中的循环语句。shell中循环语句主要是三种:

利用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语言很像,只不过使用的是两个小括号。其中,变量取值不用加美元符号,并且赋初值的时候可以有空格,也可以不加空格,判断的时候也可以加空格或者不加空格。