zoukankan      html  css  js  c++  java
  • 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的原始值

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

  • 相关阅读:
    kill -3 导出 thread dump
    JVM中锁优化,偏向锁、自旋锁、锁消除、锁膨胀
    Hibernate validator验证
    java子类实例初始化过程
    spring- properties 读取的五种方式
    Spring连接数据库的几种常用的方式
    缓存使用中的注意事项
    java动态代理原理
    classpath目录
    springmvc常用注解标签详解
  • 原文地址:https://www.cnblogs.com/liutao97/p/7865701.html
Copyright © 2011-2022 走看看