http://www.2cto.com/os/201504/394478.html
IFS放在哪里
登录系统之后,找寻IFS的身影。查找登录shell中全局环境变量,env |grep IFS,不在;查找登录shell中局部环境变量,set |grep IFS,存在。也就是说,IFS存在于登录shell的局部环境变量中。
局部变量的作用域只在当前的shell进程环境中,不能用在父shell环境,也不能用在子shell环境。那么IFS作为登录shell的局部环境变量,其作用域只在登录shell环境中。此处,再次验证一下,在登录shell换进各种设置局部变量testing="zhangsan",然后在脚本中访问该局部变量,如果访问不到,则证明局部变量没有被fork出的子shell环境拥有。最终执行脚本,没有访问到定义的局部变量testing,证明局部环境变量不能被子shell进程拥有
1. IFS作为登录shell的局部环境变量;
2. 局部环境变量的作用域是当前shell进程;
IFS默认值是空格、制表符和换行符,但是如果你不想用那么多,只想要用制表符或者换行符中的一个来做分隔(这里以换行符来进行讨论,因为比较容易观察),你同样可以用以上三种方式进行IFS的重新赋值,IFS='\n',IFS=$"\n",IFS=$'\n',这一下就有区别了,第一个就是普通字符反斜杠和n,第二个是换行符,不过只有在执行的时候才会进行转化,第三个是一个已经转换了的回车符NL,在屏幕上直接就回车了。[work@localhost bin]$ echo '\n'
\n
[work@localhost bin]$ echo $"\n"
\n
[work@localhost bin]$ echo $'\n'
#这里输出的是一个换行
$、转义字符、单引号在一起,则会转义
mission@DESKTOP-QDIMSL3:~/tmp$ cat 1.sh
#!/bin/bash
IFS="\n"
str="a\nb\nc\nd\\n"
echo $str
for i in $str
do
echo $i
done
echo "------"
str2="anbncndn"
echo $str2
for ii in $str2
do
echo $ii
done
mission@DESKTOP-QDIMSL3:~/tmp$ ./1.sh
a b c d
a
b
c
d
------
a b c d
a
b
c
d
mission@DESKTOP-QDIMSL3:~/tmp$
如果IFS出现在字符串里时,用echo显示时,是会被当成空白进行分隔,用for 循环提取时,IFS的值如果是可以转义的,则会转义输出,是其他字符的则