您的位置:首页 > 其它

IFS域内字段分隔符

2016-07-29 17:17 134 查看
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的值如果是可以转义的,则会转义输出,是其他字符的则

会当成空白,不输出(就这样理解)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: