Shell 中获取用户输入

Shell 中获取用户输入

有交互才更丰富

尽管可以通过命令行选项和参数从脚本用户处获取输入,但有时脚本的交互性还需要更强一些,可以使用 bash shell 提供的 read 命令交互地获取用户输入。

基本的读取

read 命令从标准输入(例如键盘)或另一个文件描述符中接收输入。在收到输入后,read 命令会将数据放进一个变量。

#!/usr/local/bin/bash

echo -n "Enter your name: "
read name
echo "Hello $name, welcome!"

这个简单示例中,echo 命令使用了 -n 选项,该选项不会在字符串末尾输出换行符,允许脚本用户紧跟其后输入数据,而不用新换一行。同时,read 会将命令提示符后输入的所有数据分配给单个变量,除非你指定多个变量:read name age。如果变量的数目不够,输入部分多出的数据就全部分配给最后一个变量。

如果在 read 命令行中不指定变量,read 命令会将它收到的任何数据都放进特殊的系统环境变量 REPLY 中。

如果使用 -p 选项,可以直接在 read 命令行直接指定提示信息:

read -p "Please enter you name: " name

超时处理

可以使用 -t 选项定义一个计时器,指定等待的秒数。当计时器过期后,read 命令会返回一个非零的退出状态码。可以使用判断语句来处理这种情况:

if read -t 60 -p "Please enter your name: " name
then
    echo "Hello $name, welcome!"
else
    echo
    echo "Sorry, timeout!"
fi

也可以不对输入过程计时,而是让 read 命令来统计输入的字符数,当输入的字符达到预设的字符数时,就自动退出,将输入的数据赋给变量。

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 "okay, see you..."
       exit;;
esac

隐藏输入

read 命令的 -s 选项可以避免输入的数据出现在显示器上(实际上,数据会被显示,只是 read 命令将文本颜色设置成背景颜色一样):

read -s -p "Enter your password: " pass
echo
echo you have entered: $pass

从文件中读取

read 命令可以用来读取文件里保存的数据。每次调用 read 命令,它都会从文件中读取一行文本,当文件中再没有内容时,退出并返回非零状态码。

最常见的方法是对文件使用 cat 命令,将结果通过管道直接传给含有 read 命令的 while 命令一行行读取文件中数据:

count=1
cat test | while read line
do
    echo "Line $count: %line"
    count=$[ $count + 1 ]
done
echo "finished processing the file"

以上。

Ads by Google

林宏

Frank Lin

Hey, there! This is Frank Lin (@flinhong), one of the 1.41 billion . This 'inDev. Journal' site holds the exploration of my quirky thoughts and random adventures through life. Hope you enjoy reading and perusing my posts.

YOU MAY ALSO LIKE

Hands on IBM Cloud Functions with CLI

Tools

2020.10.20

Hands on IBM Cloud Functions with CLI

IBM Cloud CLI allows complete management of the Cloud Functions system. You can use the Cloud Functions CLI plugin-in to manage your code snippets in actions, create triggers, and rules to enable your actions to respond to events, and bundle actions into packages.

Using Liquid in Jekyll - Live with Demos

Web Notes

2016.08.20

Using Liquid in Jekyll - Live with Demos

Liquid is a simple template language that Jekyll uses to process pages for your site. With Liquid you can output complex contents without additional plugins.

Shell 脚本中的循环语句

Linux Notes

2017.11.13

Shell 脚本中的循环语句

结构化循环命令在编程中很常见。通常需要重复一组命令直到触及某个特定条件。比如处理某个目录下的所有文件、系统上的所有用户或某个文本文件中的所有内容。bash shell 提供了三个常用的循环命令 for、while 和 until,就来好好研究研究吧。

TOC

Ads by Google