14.5 将选项标准化
有一些选项是标准化了,约定俗成的东西。自己写的脚本中可以支持这些选项。这样用户使用你的脚本就不用查手册了。
比如:
-a 显示所有对象
-c 生成一个计数
-h 显示命令的帮助信息
-I 忽略文本大小写
-v 生成详细输出
……
14.6 获得用户输入
使用场景:脚本运行时可以问个问题,并等待运行脚本的人来回答。
为此提供了read命令
14.6.1 基本的读取read命令从标准输入或另外一个文件描述符中接收输入。收到输入后read将数据放进一个变量中去。
read 还可以接 –p选项,允许在read命令行指定提示符。
还可以指定多个变量,如果变量数量不够,那么剩下的数据就全部分配到最后一个变量中。
如果没有指定变量名,会放到环境变量REPLY中。
例子:
1 #!/bin/bash
2 echo -n "Please input you name:"
3 read name
4 echo "Hello $name, welcome to xcy program"
5 read -p "Please input you age: " age # 指定提示符
6 echo "you are live:$[ $age * 365 ] days"
7 read -p "step2 Please input you company and num:" company num # 多个变量
8 echo "you company:$company, num:$num"
9 read -p "REPLY test:" # 不值得变量名
10 echo "You input REPLY = $REPLY"
运行:
14.6.2 超时如果使用了read,脚本会一直等待用户输入。
如果不管脚本是否有数据输入都继续执行下去,就可以指定一个定时器。
-t 指定一个计时器,指定了read命令等待输入的秒数。定时器过期后,read返回一个非0退出状态码。
还可以不对输入过程计时,而是统计字数,字数到了就自动退出,将输入数据赋给变量。
用-n选项,后面接字数
例子:
1 #/bin/bash
2 if read -t 10 -p "Input you name:" name # 计时
3 then
4 echo "Hi $name, welcome"
5 else
6 echo
7 echo "sorry, to slow"
8 fi
9
10 read -n1 -p "Do you want to continue [Y/N]? " answer # 限定字符
11 case $answer in
12 Y) echo
13 echo "you are continue ......";;
14 N) echo
15 echo "Bye Bye!!!";;
16 *) echo
17 echo "Error, Bye";;
18 esac
14.6.3 隐藏方式读取
比如输入密码,不想别人看见,就需要隐藏输入。
加 –s 选项
比如:
1 #!/bin/bash
2 read -s -p "input you Pass:" Pass
3 echo
4 read -s -p "input you Pass again:" Pass1
5 echo
6 if [ $Pass = $Pass1 ] # 字符串比较是否相同
7 then
8 echo "Success!!!"
9 else
10 echo "Falied, Two inconsistent"
11 fi
14.6.4 从文件中读取
每次调用read命令,它都会从文件中读取一行文本。当文本没有内容时,read返回非零退出状态码。
难点在于将文件中的数据传给read命令。最常见的方法是对文件使用cat命令,将结果通过管道直接传给含有read命令的while命令。
例子:
1 #!/bin/bash
2 read -p "Please input you read file name:" name
3 if [ -e $name ] # 是否存在
4 then
5 count=1
6 cat $name | while read line
7 do
8 echo "Line $count:$line"
9 count=$[ $count + 1 ]
10 done
11 else
12 echo "$name not exist"