IFS

在shell中使用内部变量IFS来决定项目列表或值列表的分隔符,IFS的默认值是空格、Tab制表或换行符。

使用for循环读取项目列表或值列表时,就会根据IFS的值判断列表中值的个数,最终决定循环的次数。

例如:A="hello word linux",使用空格作为分隔符时,变量A有三列,使用w作为分隔符,变量A有两列。

IFS的多个值之间是“或”关系。

正常使用echo输出IFS变量的值时,是看不到内容的,但是可以通过od命令将数据转换为八进制数据后再查看。

Shell:IFS_Shell

040是空格键,011是Tab制表符,012是换行符。

案例:

下面因为修改了默认的IFS为冒号,所以变量只有冒号分割时,才能让x,y,z都能够按照我们想要的去赋值。

[root@localhost ~]# OLD_IFS="$IFS"
[root@localhost ~]# IFS=":"
[root@localhost ~]# read -p "输入三个数据:" x y z
输入三个数据:1 2 3
#因为冒号作为分隔符,而1 2 3之间没有冒号,所以1 2 3直接赋值给x,y和z都为空
[root@localhost ~]# echo $x
1 2 3
[root@localhost ~]# echo $y

[root@localhost ~]# echo $z

[root@localhost ~]# read -p "输入三个数据:" x y z
输入三个数据:1:2:3
[root@localhost ~]# echo $x
1
[root@localhost ~]# echo $y
2
[root@localhost ~]# echo $z
3
[root@localhost ~]# IFS=$OLD_IFS
[root@localhost ~]# read -p "输入三个数据:" x y z
输入三个数据:1 2 3
[root@localhost ~]# echo $x
1
[root@localhost ~]# echo $y
2
[root@localhost ~]# echo $z
3

此外也可以定义多个分隔符:

[root@localhost ~]# OLD_IFS="$IFS"
[root@localhost ~]# IFS=":;."
[root@localhost ~]# read -p "输入三个数据:" x y z
输入三个数据:1.2:3
[root@localhost ~]# echo $x
1
[root@localhost ~]# echo $y
2
[root@localhost ~]# echo $z
3
[root@localhost ~]# IFS=$OLD_IFS

我们可以设置特殊的控制字符吗,例如IFS="\t"

[root@localhost ~]# OLD_IFS="$IFS"
[root@localhost ~]# IFS="\t"
[root@localhost ~]# read -p "输入三个数据:" x y z
输入三个数据:1  2       3
[root@localhost ~]# echo $x
1       2       3
[root@localhost ~]# echo $y

[root@localhost ~]# echo $z

[root@localhost ~]# read -p "输入三个数据:" x y z
输入三个数据:1t2t3
[root@localhost ~]# echo $x
1
[root@localhost ~]# echo $y
2
[root@localhost ~]# echo $z
3

很显然,这里会使用字母t作为默认分隔符,因为这里\是转义、屏蔽的意思,对后面的t进行屏蔽,意思就是一个普通的字母t。

那么如何设置特殊的控制字符作为分隔符呢?必须使用$'string'的方式,否则系统无法正确的理解特殊字符的含义。

特殊的控制字符如下:

控制字符 描述
\a Bell响铃符
\b Backspace退格符
\f Form Feed换行符,光标仍旧停留在原来的位置
\n New Line换行符,光标停留在行首
\r Return光标移至行首,但不换行
\t Horizontal Tab水平制表符
\v Vertical Tab垂直制表符
\nnn 任意八进制字符

测试:

[root@localhost ~]# IFS=$'\t'
[root@localhost ~]# read -p "输入三个数据:" x y z
输入三个数据:1  2       3
[root@localhost ~]# echo $x
1
[root@localhost ~]# echo $y
2
[root@localhost ~]# echo $z
3

如何通过命令将IFS变量的值还原为默认值?命令如下:

IFS=$' \t\n'