Linux shell 获得用户输入(read命令)

前言

如果你想在脚本运行时问个问题,并在等待运行脚本的人来回答。bash shell为此提供了read命令。

read的基本读取

read命令的从标准的输入或另一个文件描述符中接受输入。在收到输入后,read命令会将数据放进一个变量。下面是read命令的最简单方法。

#!/bin/bash

#测试read命令

echo -n "Enter your name: "
read name
echo "Hello $name,welcome to my program"

输出结果
在这里插入图片描述
从上面的例子中可以看到 echo命令使用了 -n选项。该选项不会在字符串末尾输出换行符,允许脚本用户紧跟其后输入数据,而不是下一行。

实际上,read命令包含了-p选项,允许你直接在read命令行指定提示符。

#! /bin/bash

read -p "Please enter your age: " age
days=$[ $age * 365 ]
echo "That makes you over $days days old"

输出结果
在这里插入图片描述
上面的例子中,read命令中指定了变量,如果不想指定变量。read命令会将它收到的任何数据都放进特殊环境变量REPLY中。下面的例子举例环境变量REPLY。

#!/bin/bash

#测试 REPLY 环境变量

read -p "Enter your name: "
echo
echo "Hello $REPLY, welcome to my program"

输出结果:
在这里插入图片描述

REPLY环境变量会保存输入的所有的数据,可以在shell脚本中像其他变量一样使用。

read -t 计时器

在使用read命令是要当心,脚本很可能会一直苦等着在脚本用户输入。如果不管是否有数据输入,脚本都会继续执行,这时候你可以使用 -t选项来指定一个计时器。-t选项指定了read命令等待输入的秒数。当计时器过期后,read命令会返回一个非零退出状态码。

#! /bin/bash

#数据输入定时

if read -t 5 -p "Please enter your name: " name
then
  echo "Hello $name,welcome to my script"
else
  echo
  echo "Sorry, too slow"

fi

输出结果:

在这里插入图片描述
如果在5秒过后没有输入,会有如下提示:

在这里插入图片描述

如果计时器过期,read命令会以非零退出状态码退出,可以使用如 if-then语句或while循环这种标准的结构化语句来清理所发生的具体情况。

下面例子中,计时器过期时。if语句不成立,shell会执行else部分的命令。
通过read命令来统计输入的字符数。当输入的字符达到预期设的字符数时,就自动退出,将输入的数据赋给变量。

#!/bin/bash

read -n1 -p "Do you want to continue [Y/N]" answer
case $answer in
Y | y) echo
     echo "fine ,continue on..." ;;
N | n) echo
     echo OK ,goodbye 
     exit ;;
esac
echo "This is the end of the scrpt"

输出结果:
在这里插入图片描述否定回答:
在这里插入图片描述

本例子中将-n选项和值1一起使用,告诉read命令在接受单个字符后退出。只要按下单个字符回答后,read命令就会接受输入并将它变量,无需按回车键。

隐藏方式读取

有时候你需要从脚本用户中得到输入,但又在屏幕上显示输入的信息。其中典型的例子就是输入的密码,但除此之外,还有很多需要隐藏的数据类型。-s选项可以避免在read命令中输入的数据出现在显示屏上。

#!/bin/bash

#从监视器隐藏输入数据

read -s -p "Enter your password: " pass
echo
echo "Is your password really $pass?"

输出结果:
在这里插入图片描述
输入提示符输入的数据不会出现在屏幕上,但会赋给变量,以便在脚本中使用。

总结

从脚本用户获得数据的一种交互式方法是read命令。read命令支持脚本向用户提问并等待。read命令会将脚本用户输入的数据赋给一个或多个变量。

参考 : Linux命令行与shell脚本编程大全

发布了71 篇原创文章 · 获赞 42 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chen1415886044/article/details/103284472