IFS域内字段分隔符

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的值如果是可以转义的,则会转义输出,是其他字符的则

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值