IFS
在shell中使用内部变量IFS来决定项目列表或值列表的分隔符,IFS的默认值是空格、Tab制表或换行符。
使用for循环读取项目列表或值列表时,就会根据IFS的值判断列表中值的个数,最终决定循环的次数。
例如:A="hello word linux",使用空格作为分隔符时,变量A有三列,使用w作为分隔符,变量A有两列。
IFS的多个值之间是“或”关系。
正常使用echo输出IFS变量的值时,是看不到内容的,但是可以通过od
命令将数据转换为八进制数据后再查看。
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'