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

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

 

转载于:https://www.cnblogs.com/liutao97/p/7865701.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值