shell读取键盘输入

时间:2019-04-16 23:59:04  来源:igfitidea点击:

使用read命令可以接收来自键盘的输入值,并将它赋值给用户定义的shell变量。

read 命令的语法

read -p "Prompt" variable1 variable2 variableN

-p "Prompt": 显示提示信息Prompt给用户
variable1:第一个输入值(单词)将被分配给variable1。
variable2:第二个输入值(单词)将被分配给variable2。

示例

单个输入

#!/bin/bash
read -p "Enter your name : " name
echo "Hi, $name. "

多次输入

#!/bin/bash
# 读取三个数字,将它们赋值给3个变量
read -p "Enter number one : " n1
read -p "Enter number two : " n2
read -p "Enter number three : " n3

# 显示变量值
echo "Number1 - $n1"
echo "Number2 - $n2"
echo "Number3 - $n3"

设置输入超时

使用 -t选项可以设置读取的超时时间。如果在指定时间内没有读取完输入行,则会导致超时并返回错误。

10秒内没有输入回车,则超时:

#!/bin/bash
read -t 10 -p "Enter your name : " name
echo "Hi, $name. "

shell输入密码

-s选项用于输入密码,它会将用户的输入隐藏,不显示在显示器上。

#!/bin/bash
read -s -p "Enter Password  : " my_password
echo 
echo "Your password - $my_password"

处理read中的多个输入值

看一下下面的例子

read -p "Enter directory to delete : " dirname
echo "$dirname"
Enter directory to delete : foo bar /tmp/data
foo bar /tmp/data

foo bar /tmp/data三个值都赋给了 dirname。

$IFS决定了shell如何识别字段。 查看IFS的实际值:

[root@rhel6 tmp]# cat -etv <<<"$IFS"
 ^I$  # 空格,tab键和换行符
$ # 换行

使用$IFS来读取多个输入:

delfiles="foo bar /tmp/data" 

read -r f1 f2 f3 <<< "$delfiles"

f1 ,f2,f3分别对应 foo ,bar, /tmp/data

如何修改IFS使用的分隔符

假设我们要处理文件/etc/passwd行

分割符是冒号:

oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
pulse:x:496:493:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin

我们可以先将IFS的值先保存起来,临时设置分割符为冒号,最后再还原:

pwd="pulse:x:496:493:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin"
old="$IFS"
IFS=:
read -r login password uid gid info home shell <<< "$pwd"
echo "login name:" $login
echo "home directory:" $home
IFS="$old"