IFS域内字段分隔符
2016-07-29 17:17
134 查看
http://www.2cto.com/os/201504/394478.html
局部变量的作用域只在当前的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,在屏幕上直接就回车了。
$、转义字符、单引号在一起,则会转义
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的值如果是可以转义的,则会转义输出,是其他字符的则
会当成空白,不输出(就这样理解)
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的值如果是可以转义的,则会转义输出,是其他字符的则
会当成空白,不输出(就这样理解)
相关文章推荐
- DatePickerDialog和EditText配合使用
- QT--一些零散的代码备份
- Spring中MultipartHttpServletRequest实现文件上传 生成缩略图
- android服务
- Linux2.6内核--进程调度理论
- ajax循环执行
- Git命令行使用教程01
- thinkPHP bug解决
- @MappedSuperclass 解决父类属性不能传递给子类
- Android必知必会-App 常用图标尺寸规范汇总
- 图像压缩编码和解码原理
- eCryptfs - close系统调用
- Android Studio你不知道的调试技巧
- python 循环读取txt文档 并转换成csv
- hdu 3294 Manacher模版题
- centos7下 tomcat的安装与配置
- R语言常用命令集
- Service的两种启动方式onstartService和onbindService区别
- 使用lnmp实现wopdpress,phpmyadmin服务,并为phpmyadmin提供https服务
- 安卓计算下载速度