特殊环境变量IFS,叫做内部字段分隔符(internal field separator)
默认情况下,bash shell默认会以下列字符作为内部字段分隔符:
- 空格
- 制表符
- 换行符
读取一个文件
可以临时更改IFS环境变量的值来限制被bash shell当作字段分隔符的字符。
如拾起只能识别换行符,IFS=$’\n’.
下面先新建一个文件,如下所示:
$ cat states
Alabama
Alaska
Arizona
Delaware
再新建一个脚本,命名为test
$cat test
#!/bin/bash
# reading values from a file
file="states"
IFS=$'\n'
for state in $(cat $file)
do
echo "Visit beautiful $state"
done
执行test脚本,可以获得如下输出
Visit beautiful Alabama
Visit beautiful Alaska
Visit beautiful Arizona
Visit beautiful Delaware
注:如果要指定多个IFS字符,只要将它们在赋值行串起来就行
如IFS=$’\n’:;"会将换行符,冒号,分号,双引号作为字段分隔符。
循环处理文件
通过修改IFS,不停变换字段分隔符,可以用在循环处理文件中
先新建一个文件:
$cat cities
Shandong:jinan
heilongjiang:haerbin
fujian:fuzhou
yunan:kunming
再新建一个脚本,命名为test2
$cat test2
#!/bin/bash
#city in province
IFS=$'\n'
for city in $(cat cities)
do
echo City is $city
IFS=:
for value in $city
do
echo " $value"
done
done
执行test2脚本,可以获得如下输出:
City is Shandong:jinan
Shandong
jinan
City is heilongjiang haerbin
heilongjiang
haerbin
City is fujian fuzhou
fujian
fuzhou
City is yunan kunming
yunan
kunming
从上面的例子中,可以看到一开始将IFS设置为换行符,用于读取每行数据
之后通过修改IFS为冒号,用于分隔每行数据中每个字段,最后通过嵌套循环展示。