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

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包围起来。如果不这样做,遇到包含空格的路径或文件名就会出错

你可能感兴趣的:(shell脚本编程<四>:for命令)