您的位置:首页 > 运维架构 > Shell

shell脚本编程<四>:for命令

2016-01-03 19:12 651 查看

for命令

基本格式如下

for var in
do
commands
done


读取列表中的值

#!/bin/bash
for test in Alabama Alaska Arizona Arkansas California Colorado
do
echo $test
done


读取列表中的复杂值

注意如列表中,一些符号注意使用转义符来转义或双引号来表示,如

#!/bin/bash
for test in i don\'t know if "this'll" work
do
echo $test
done


如果想打印一些有空格的值,看一个栗子

#!/bin/bash
for test in  China "New York"
do
echo $test
done


从变量中读取列表

shell脚本中经常发生的是积累了存储于变量中的一个值的列表,然后需要通过列表迭代,例如

list="Alabama Alaska Arizona Arkansas California Colorado"
#以下为常用语句
list=$list" Connectioncut"

for state in $list
do
echo $state
done


读取命令中的值

生成列表中使用的值的另一种方法是使用命令的输出,见下

file="states"
#千万注意反引号和单引号
for state in `cat $file`
do
echo $state
done


其中states文件为:
Alabana
Alaska
New York
North Hampshire


会看到打印的值并不是你想要的

- 改变字段分割值

IFS:内部字段分割符。特殊的环境变量IFS定义了bash shell用作字段分割符的字符列表。默认情况下,bash shell将下面的字符看作字段分割符:

1. 空格

2. 制表符

3. 换行符

如果bash shell在数据中遇到这几种字符中的一种,它就会认为你正在列表中启动新的数据字段。当处理能够包含空格的是数据时,就会产生干扰,如前的示例所示。

要解决该问题,可以在shell脚本中暂时更改环境变量IFS的值,限制bash shell看作是字段分隔符的字符,如若只想将IFS的值更改为只识别换行符,需要这样做:

IFS=$’\n’

在脚本中添加这条语句后,通知bash shell在数据值中忽略空格和制表符。看下面的栗子

file="states"
IFS=$'\n'

for state in `cat $file`
do
echo $state
done


警告:当使用较长的脚本时,可能在一个位置更改了IFS的值,但忘记了该值,并在脚本的其他地方假设为默认值。一个安全的做法是,在更改了原始IFS值之前将它保存起来,当需要运用时回复即可,如下

IFS.OLD=$IFS
IFS=$'\n'
<use the new IFS value in code>
IFS=IFS.OLD


环境变量IFS有其他的很好应用,如果想迭代文件中用冒号分割的值(如在文件/etc/passwd中),需要做的就是将IFS设置为冒号:

IFS=:

如果想指定多个IFS字符,只需将它们在赋值行中串联起来即可

IFS=$’\n’:;”

该赋值使用了换号符、冒号、分号和双引号字符作为字段分割符。

- 使用通配符读取目录

可以使用for命令自动迭代文件的目录。如下

#!/bin/bash
#rich为用户名
for file in /home/rich/test/*
do
if [ -d "$file" ]
then
echo "$file is a dir"
elif [ -f "$file" ]
then
echo "$file is a file"
fi
done


注意在本例中对if语句测试中做了一些不同的处理,如

if [ -d "$file" ]


为什么呢?在Linux中,包含空格的路径和文件名是合法的。要容纳它们,应该使用双引号将变量$file包围起来。如果不这样做,遇到包含空格的路径或文件名就会出错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: