bash之read命令

一、概述

read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。


二、使用举例(这里仅列出一些常用的选项)

1.基本读取

#!/bin/bash 
echo -n "Enter your name:" #参数-n的作用是不换行,echo默认是换行
read name #从键盘输入
echo "hello $name, welcome to my program"
exit 0 #退出shell程序。

其等效于以下:

read -p "Enter your name:" name       #-p参数,允许在read命令行中直接指定一个提示

在上面read后面的变量只有name一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二个变量。如果输入数据个数过多,则最后剩下的所有值都给最后一个变量,如果太少输入不会结束。

2.在read命令行中也可以不指定变量

如果不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中

read -p "Enter a number" 
echo $REPLY

3.计时输入
使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用 -t 选项指定一个计时器,指定read命令等待输入的秒数。当计时满时,read命令返回非零值(0为正常退出状态); 

#!/bin/bash 
if read -t 5 -p "please enter your name:" name
then
echo "hello $name, welcome to my script"
else
echo "sorry,too slow"
fi
exit 0

3.设置计数输入的字符
当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。 

#!/bin/bash 
read -n1 -p "Do you want to continue [Y/N]? " answer
case $answer in
Y|y)
echo "fine ,continue";;
N|n)
echo "ok,good bye";;
*)
echo "error choice";;
esac
exit 0

该例子使用了-n选项,后接数值1,指示read命令只要接受到一个字符就退出。只要按下一个字符进行回答,read命令立即接受输入并将其传给变量。无需按回车键。 
4.默读(输入不显示在监视器上)

有时不希望输入的数据显示在监视器上。典型的例子就是输入密码,当然还有很多其他需要隐藏的数据。-s 选项能够使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)。

#!/bin/bash 
read -s -p "Enter your password: " pass
echo "your password is $pass"
exit 0

5.读文件

每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。读取文件的关键是如何将文本中的数据传送给read命令。最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令 。
 

#!/bin/bash 
count=1
cat dat| while read line #cat 命令的输出作为read命令的输入,read读到的值放在line中
do
echo "$count:$line"
count=$(($count + 1))
done
exit 0



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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值