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的原始值

此时,我们再调用我们的脚本,发现一切正常

 

posted @ 2017-11-20 12:12  liutao97  阅读(325)  评论(0编辑  收藏  举报