IFS 知识问题解决
练习一:写一个脚本
1.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么,并指出该用户的shell
#!/bin/bash # file=`cat /etc/passwd` for i in $file do username=`echo $i | cut -d : -f 1 ` echo "hi,$username" done
2.这样虽然能实现要求,但是仔细产看会发现一些问题,比如/etc/passwd一共就64个,但脚本跑出来有139个。
[root@localhost shell]# sh say_hi.sh | wc -l 139 [root@localhost shell]# cat /etc/passwd | wc -l 64 [root@localhost shell]#
通过对比发现,脚本把/etc/passwd中以空格分隔的描述也认为是ID了。
原因是IFS 默认的分隔符号有空格
1 查看IFS的值
echo "$IFS"
echo "$IFS"|od -b
0000000 040 011 012 012
0000004
直接输出IFS是看不到值的,转化为二进制就可以看到了,"040"是空格,"011"是Tab,"012"是换行符"\n" 。最后一个 012 是因为 echo 默认是会换行的。
所以我们要把脚本进行优化
[root@localhost shell]# cat say_hi2.sh #!/bin/bash # old_ifs=$IFS #保存原始值 IFS="^" #改变IFS的值 file=`cat /etc/passwd` for i in $file do username=`echo $i | cut -d : -f 1 ` echo $username done IFS=$old_ifs #还原IFS的原始值
此时,我们再调用我们的脚本,发现一切正常