Linux-处理用户输入
Bash Shell提供了一些不同的方法来从用户处获得数据,包括命令行参数(添加在命令后的数据)、命令行选型(可修改命令行为单个字母)以及直接从键盘读取输入的能力。
1.命令行参数
向Shell脚本传递数据的基本方法时使用命令行参数。命令行参数允许在运行脚本时向命令行添加数据。
$ ./addem 10 30
本例传递了两个命令行参数(10和30)。
1.2读取参数
Bash shell会将一些称为位置参数的特殊变量分配给输入到命令行中的所有参数。
这也包括shell所执行的脚本名称。位置参数变量是标准的数字:
位置参数 | 参数 |
---|---|
$0 | 程序员 |
$1 | 第一个参数 |
$2 | 第二个参数 |
依次类推…直到第九个参数$9。
命令行参数之间,必须用空格分开。
每个参数的都是用空格分隔的,所以shell会将空格当成两个值的分隔符。要在参数中包含空格,必须要用引号(单引号或者双引号都可)。
1.3 读取脚本名
使用参数$0获取shell在命令行启动的脚本名。
当传给$0变量的实际字符串不仅仅是脚本名,而是完整的脚本路径时,变量$0就会使用整个路径。
$ bash /home/Christine/test5.sh
通过使用basename命令,可以返回不包含路径的脚本名。
name=$(basename $0)
1.4测试参数
在shell脚本中使用命令行参数时要注意,如果脚本不加参数运行,可能会出问题。
$ ./addem 2
当脚本认为参数变量中会有数据而实际上没有时,脚本很有可能会产生错误消息。
在使用参数前一定要检查其中是否存在数据。
if [ -n "$1"]
then
echo Hello $1
else
echo "no."
fi
2.特殊参数变量
2.1 参数统计
特殊变量$#含有脚本运行时携带的命令行参数的个数。可以在脚本中任何地方使用这个特殊变量,就跟普通变量一样。
$ cat test8.sh
#!/bin/bash
echo There were $# parameters supplied.
$ ./test8.sh
There were 0 parameters supplied.
$ cat test8.sh 1 2 3 4 5
#!/bin/bash
echo There were $# parameters supplied.
$ ./test8.sh
There were 5 parameters supplied.
使用参数前测试参数的总数。
$ cat test9.sh
#!/bin/bash
if [ $# -ne 2]
then
echo
echo Usage : test9.sh a b
echo
else
total=$[ $1 + $2 ]
echo
echo the total is $total
fi
2.2抓取所有的数据
$*和&@变量可以用来轻松访问所有的参数。这两个变量都能够在单个变量中存储所有的命令行参数。
*变量会将这些参数视为一个整体,而不是多个个体。
$@变量会将命令行上提供的所有参数当作同一字符串中的多个独立的单词。这样就能够遍历所有的参数值,得到每个参数。通过使用for命令完成。
3.移动变量
bash shell的shift命令能够用来操作命令行参数。
shift命令会根据它们的相对位置来移动命令行参数。
在使用shift命令时,默认情况下它会被每个参数变量向左移动一个位置。所以,变量$3的值会移到$2中,变量$2的值会移到$1,而变量$1的值会被删除。(变量$0的值,即程序员,不会改变)
4.处理选项
选项是跟在单破折线后面的单个字母,他能改变命令的行为。
5.选项标准化
6.获得用户输入
6.1 基本的读取
read命令从标准输入(键盘)或另一个文件描述符中接受输入。在收到输入后,read命令会将数据放进一个变量。
$ cat test.sh
#!/bin/bash
echo -n "Enter your name"
read name
echo "Hello $name"
6.2超时
使用read命令,脚本可能会一直等待脚本用户的输入。如果不管是否有数据输入,脚本都必须继续执行,可以使用-t选项来指定一个计时器。-t选项指定了read命令等待输入的秒数。当计时器过期后,read命令会返回一个非零退出状态码。
6.3隐藏方式读取
-s 选项可以避免在read命令中输入的数据出现在显示器上。
6.4从文件中读取
可以用read命令来读取Linux系统上文件里保存的数据。每次调用read命令,都会从文件中读取一行文本。
当文件中没有内容时,read命令会退出并返回非零退出状态码。
通过使用cat命令,将文件中的数据传给read命令。通过管道直接传给read命令的while命令。