Bash read命令

问题场景:IFS="," read -d ' ' -ra  ARG  <<<  ${ARGS}

概念

read 命令是一个非常重要的bash命令,用于接收标准输入或者其他文件描述符的输入,并且可以和用户进行交互。得到输入后,read命令将数据放入一个标准变量中。该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量$REPLY。read每次调用读取一行。

用法 

read [选项] [变量名] 

参数说明
-a指定变量为数组
-r反斜杠转义不会生效,意味着行末的’\’成为有效的字符,例如使 \n 成为有效字符而不是换行
-p指定输出提示信息
-d输入结束符,当输入的内容出现这个字符时,立即结束。一般情况下是以IFS为参数的间隔,但是通过-d自定义
-n指定输入的字符长度
-t指定读取值时等待的时间(秒),read命令会一直等待用户输入,时间到自动退出
-s不显示输入的值,一般用于密码

示例:

1、参数示例

# 不带参数,输入值都用空格隔开
[hadoop@hadoop01 ~]$ read ARG
arg1 arg2
[hadoop@hadoop01 ~]$ echo $ARG
arg1 arg2

# 定义多个变量,变量和输入值都用空格隔开。顺序赋值,超过自动退出,不足会等待输入
[hadoop@hadoop01 ~]$ read ARG1 ARG2
hello hi
[hadoop@hadoop01 ~]$ echo $ARG1
hello
[hadoop@hadoop01 ~]$ echo $ARG2
hi

# -r,反斜杠也会被输出
[hadoop@hadoop01 ~]$ read -r ARG
\arg
[hadoop@hadoop01 ~]$ echo $ARG
\arg

# -d,指定的字符作为命令的结束输入,未输入指定的结束符前输入窗口一直存,enter键也无效
[hadoop@hadoop01 ~]$ read -d "-" ARG
arg1
arg2
-[hadoop@hadoop01 ~]$ echo $ARG
arg1 arg2

# -a,定义数组
[hadoop@hadoop01 ~]$ read -a ARG
arg1 arg2
[hadoop@hadoop01 ~]$ echo ${ARG[0]} ${ARG[1]}
arg1 arg2

# -p,指定输出提示信息
[hadoop@hadoop01 ~]$ read -p "please enter arg:" ARG
please enter arg:arg1
[hadoop@hadoop01 ~]$ echo $ARG
arg1

2、示例脚本

#!/bin/bash
read -t 10 -p "Please enter user:" user
echo "User is $user"

read -s -n 6 -t 10 -p "Please enter password:" password
echo "Password is $password"

3、读取文件的首行并赋值给变量ARG

read -r line < file
#输入重定向操作符 < file 表示打开并读取文件file,然后将它作为read命令的标准输入。

[hadoop@hadoop01 ~]$ cat file 
helle /data/info
hello world
hello hey
[hadoop@hadoop01 ~]$ read -r line < file 
[hadoop@hadoop01 ~]$ echo $line
helle /data/info

4、IFS

参考: Bash IFS变量

 read命令读入的行被分隔成多个单词,会删除包含在IFS变量中出现的所有字符,但这意味着开头和结尾的空格和制表符都会被删除。如果想保留这些符号,可以通过设置IFS为空来完成:

IFS= read -r line < file

5、读文件 

cat查看后,通过管道将结果传递给read的while,read每次调用读取一行。

count=1;
cat file | while read line; do
    echo "$count: $line"
    count=$(($count + 1))
done

6、读方法输出的结果

while IFS= read -d '' -r ARG; do
  CMD+=("$ARG")
done << (build_command "$@")

 

Bash 中,`read` 命令用于从标准输入读取一行或多行文本,默认情况下它会一直等待用户输入直到按下回车键。为了实现超时功能,即如果用户在指定时间内没有输入,则自动继续执行后续命令,可以结合 `timeout` 命令或者使用 `-t` 选项(适用于较新的 Bash 版本)。以下是具体的实现方法: ### 使用 `-t` 选项 (推荐) 对于支持此特性的 Bash 版本来说,最简单的方式就是直接给 `read` 添加一个时间限制参数 `-t` 后面接秒数表示等待的时间长度: ```bash echo "请输入您的名字:" if read -t 5 name; then echo "你好, $name!" else echo "对不起,您花费了太长时间考虑..." fi ``` 在这个例子中,程序会在显示提示信息之后开始计时,若五秒钟内未收到用户的任何回应便会触发 else 分支并给出相应的反馈;反之则正常输出问候语。 ### 使用 timeout 命令 如果不希望依赖于特定版本的特性或者是出于跨平台兼容性考量的话,还可以借助外部工具如 GNU 的 `timeout` 来达到类似的效果: ```bash #!/bin/bash echo "请输入密码:" # 这里假设我们不需要实际获取到输入值而仅仅是检测是否有按键动作发生. # 如果需要捕获输入,请调整下面这条指令中的细节部分。 if output=$(timeout 10s sh -c 'read -rs line && echo "$line"'); then echo "收到了输入." else echo "超时了!" fi ``` 这里需要注意的是,在某些环境中可能还需要安装额外的支持包才能正常使用 `timeout` 功能。 总之,无论是采用内置的 `-t` 参数还是外挂式的解决方案都可以很好地满足需求,选择合适的方法取决于具体的应用场景和个人偏好等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

訾零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值