• 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"是换行符" " 。最后一个 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的原始值

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

  • 相关阅读:
    C#枚举(一)使用总结以及扩展类分享
    .NET使用DinkToPdf将HTML转成PDF
    .NET使用MailKit进行邮件处理
    socket+django
    mysql 修改编码格式
    django中Model表的反向查询
    浅谈 session 会话的原理
    浅谈 django Models中的跨表
    django Models 常用的字段和参数
    encoding/xml
  • 原文地址:https://www.cnblogs.com/liutao97/p/7865701.html
Copyright © 2020-2023  润新知