• linux中read用法


    read在while中的经常用法:

     1 root@ubuntu:/var/lib/logrotate 10:53:05 118# cat /etc/cron.daily/logrotate 
     2 #!/bin/sh
     3 
     4 # Clean non existent log file entries from status file
     5 cd /var/lib/logrotate
     6 test -e status || touch status
     7 head -1 status > status.clean
     8 sed 's/"//g' status | while read logfile date
     9 do
    10     [ -e "$logfile" ] && echo ""$logfile" $date"
    11 done >> status.clean
    12 mv status.clean status
    13 
    14 test -x /usr/sbin/logrotate || exit 0
    15 /usr/sbin/logrotate /etc/logrotate.conf
    16 root@ubuntu:/var/lib/logrotate 10:53:19 119# 

    在上面中

    每次调用read命令都会读取文件中的”一行”文本。当文件没有可读的行时,read命令将以非零状态退出。

    通过什么样的方法将文件中的数据传给read呢?使用cat命令并通过管道将结果直接传送给包含read命令的while命令

    但是当用:

    1 root@ubuntu:/var/lib/logrotate 10:53:19 119# echo "aaa bbb" | read one two
    2 root@ubuntu:/var/lib/logrotate 10:54:50 120# echo $one

    one为空,

    但是:

    1 root@ubuntu:/var/lib/logrotate 10:56:11 124# echo "aaa bbb" | (read one two;echo -e "$one
    $two")
    2 aaa
    3 bbb

    解释:

    这里的问题在于read one是有管道产生的进程,而echo $one是外面的进程,两个one不是同一个变量,所以打印出来one没有数据

    -a: 将输入的的文本放数组中,(默认已空格或者制表符分割),数组以下标0开始;

    1 root@ubuntu:/home/dyx/linux 21:33:04 90# read -a name
    2 nihao hhaha
    3 root@ubuntu:/home/dyx/linux 21:57:45 91# echo ${name[*]}
    4 nihao hhaha
    5 root@ubuntu:/home/dyx/linux 21:57:57 92# echo ${name[1]}
    6 hhaha

    -d:指定结束符,当输入中出现指定的结束符时,read命令将认为输入已经结束(默认为换行);

    -e:从标准输入读取中时,使用Readline库获取输入(此时用户可以使用退格键、方向箭头进行简单的行编辑操作);

    -n:指定读入的字符数n;

    -p:将该选项指定的字符串输出到标准错误,并读取输入;

    -r:将读取到的字符串字段放到不同的变量中;

    1 root@ubuntu:/home/dyx/linux 22:01:29 101# read -r v1 v2 v3
    2 nifds fds fff
    3 root@ubuntu:/home/dyx/linux 22:02:10 102# echo $v1
    4 nifds
    1 root@ubuntu:/home/dyx/linux 22:02:23 103# IFS="#";read -r v1 v2 v3 
    2 fdsfdsf fds #hshfhds#fdsf dsfs
    3 root@ubuntu:/home/dyx/linux 22:05:11 104# echo $v1
    4 fdsfdsf fds 
    5 root@ubuntu:/home/dyx/linux 22:05:17 105# echo $v2
    6 hshfhds

    最好有在修改IFS之前有,Old_IFS=$IFS, 之后再IFS=$Old_IFS

    -s:先锁住屏幕,让后再从标准输入中读入字符;

    -t:如果用户在指定的时间内没有输入,就结束读取状态;

    -u:从指定的文件描述中读取。

  • 相关阅读:
    git 拉取远程代码 git branch -vv --all
    常用命令统计
    topology key
    gstreamer 相关直播源(rtmp rtsp)
    汉诺塔问题 最简单的图文讲解递归实现
    RTP 用ffmpeg
    kurento + nodejs 开源项目 webRTC 转成 RTMP输出
    RTP SDP 详解 RTCP 附带说了一下SRTP RTSP
    RxSwiftCommunity/Action使用介绍
    zsh Shell 增加自动补全、语法高亮
  • 原文地址:https://www.cnblogs.com/yi-meng/p/3204384.html
Copyright © 2020-2023  润新知