1、for命令
(1)语法
for val in list; do commands done
list参数提供了一些列用于迭代的值,val值依次赋值为list中的值,知道list轮询结束。
commands可以是一条或多条shell命令,echo $val可以查看当前循环的值
(2)读取列表中的值
$cat test #!/bin/bash # basic for command for test in A B C; do echo the next val is $test done $./test the next val is A the next val is B the next val is C
每次for命令便利提供的值列表时, 会将列表中的下个值赋给$test变量。
在最后一次迭代中,$test的值会在shell脚本中的剩余部分一直有效。
当所要迭代的值中含有空格、单引号、双引号时,for命令不能识别其为值得一部分,可以采用两种方式处理:
当遍历的值中出现空格、单引号时,可以通过在值两侧添加双引号以示区别;
当遍历的值中出现单引号、双引号时,可以通过转义字符来讲其转义;
(3)从变量或命令读取值
通常shell脚本遇到的情况是,将一系列的值存储在变量中,然后遍历整个变量列表
$cat test #!/bin/bash # using a variable to hold the list list="A B C" list=$list" D" for test in $list; do echo the next val is $test done $./test the next val is A the next val is B the next val is C the next val is D
向已知变量中增加值通过list=$list" D"实现,这个尾部添加文本的一个常用方法
生成遍历列表的另一个方法是使用命令的输出,可以通过反引号来执行任何能产生输出的命令
$cat test #!/bin/bash # reading value from a file file="alphabet" for test in `cat $file`; do echo the next val is $test done $./test the next val is A the next val is B the next val is C
(4)更改字段分隔符
bash中定义了特殊的环境变量IFS,称为内部字段分隔符。默认情况下,bash会将空格、制表符、换行符作为字段分隔符。
当我们在使用时,可以修改IFS的值已满足不同的情况。
修改IFS值格式,如:IFS=$'
', IFS=:
一般情况下载处理长脚本时,需要先将IFS的值保存在临时变量中,在使用完后再恢复它:
IFS.OLD=$IFS IFS=$' ' <use the new IFS value in code> IFS=$IFS.OLD
如果需要多个IFS字符,只需将它们在赋值时串起来即可:IFS=$'
:;"',这样就可以把换行、冒号、分好、双引号都作为字符按分隔符处理。
(5)使用通配符遍历目录
$cat test #!/bin/bash #iterate through all the files in a directory for file in /home/test/* ; do if [ -d "$file" ]; then echo "$file is a directory" elif [ -f "$file" ]; then echo "$file is a file" fi done
linux中文件或目录中可以包含空格,所以file需要使用双引号"$file"。
2、循环处理文件数据
遍历存数在文件中数据:使用循环语句和IFS变量。
经典案例,处理/etc/passwd文件中的数据:
#!/bin/bash #changing the IFS value IFS.OLD=$IFS IFS=$' ' for entry int `cat /etc/passwd`; do echo "val in $entry" IFS=: for value in $entry; do echo " $value" done done IFS=$IFS.OLD
这个脚本使用两个不同的IFS值来解析数据,第一个IFS解析出文件中单独的行,内部for循环将IFS的值修改为冒号,解析出每行中的数据。