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"