1.命令行参数
命令行参数允许在运行脚本时向命令行添加数据。
1.1 读取参数
Bash shell会将一些称为位置参数的特殊变量分配给输入到命令行中的所有参数。
这也包括shell所执行的脚本名称。位置参数变量是标准的数字:
- $0:程序名(脚本名);
- $1:第一个参数;
- $2:第二个参数;
- 依次类推,直到$9,第9个参数;
可以在shell脚本中像使用其他变量一样使用$1变量,shell脚本会自动将命令行参数的值分配给变量,不需要作任何处理。
如果需要输入更多的命令行参数,则每个参数都必须用空格分开。shell会将每个参数分配给对应的变量。
要在参数中使用包含空格的字符串,必须要用引号(单引号或双引号都可以)。
如果脚本需要的命令行参数不止9个,从第10个参数开始,需要在变量的数字周围加上花括号,比如${10}。
1.2 读取脚本名
读取脚本名用变量$0,
当$0变量的实际字符串不仅仅是脚本名,还包含完整的路径时,需要用basename命令来返回不包含路径的脚本名。
如:name=$(basename $0)
注:当在shell脚本中使用命令行参数时要小心,如果脚本不加参数运行,可能会出问题。所以在使用参数前一定要先检查其中是否有存在数据。
如:if [ -n "$1" ]
使用了-n测试来检查命令行参数$1中是否有数据。
1.3 参数统计
命令:$#
含义:统计脚本运行时携带的命令行参数的个数。
可以在脚本中任何地方使用这个特殊的变量。
注意:${$#}是无法正确返回最后一个参数的,因为花括号内不能使用$符号,可以用${!#}返回最后一个参数。
同时还需要注意的是:当命令行上没有任何参数时,${!#}变量会返回命令行用到的脚本名,而不是0.
1.4 抓取所有的参数数据
命令:$* 和 $@
含义:这两个变量都能够在单个变量中存储所有的命令行参数。
- $*:会将命令行上提供的所有参数当作一个单词保存,即其会将所有的参数当作一个整体,而不是多个个体。
- $@:会将命令行上的所有参数当作一个字符串中的多个独立的单词,这样就可以用for循环遍历所有的参数。
1.5 处理选项
选项是跟在单破折线后的单个字母,它能改变命令的行为。
1.5.1 使用getopt命令
getopt命令可以识别命令行参数,从而在脚本中解析它们时更方便。
命令格式:getopt optstring parameters
optstring:列出要在脚本中用到的每个命令行选项字母,要在每个需要参数值的选项字母后加一个冒号。
getopt会根据定义的optstring解析提供的参数。
如:getopt ab:cd -a -b test1 -cd test2 test3
1.5.2 使用getopts
2 获得用户输入
2.1 基本的读取
read命令从标准输入(键盘)或另一个文件描述符中接受输入。在收到输入后,read命令会将数据放进一个变量。
2.2 超时
使用read命令是要小心,应为脚本很可能会一直苦等着脚本用户的输入。如果不管是否有数据输入,脚本都必须继续执行,这时就可以用‘-t’选项来指定一个计时器。
‘-t’选项指定了read命令等待输入的秒数。
当计时器过期后,read命令会返回一个非0退出状态码。
也可以让read命令来统计输入的字符数,当输入的字符达到预设的字符数时就自动退出,将输入的数据赋给变量。
如:read -n1 -p "Do you want to continue [Y/N]? " answer
解释:
- Read 命令包含了-p选项,允许直接在read命令行指定提示符;
- read命令和-n选项加数值1一起使用,表示在接受单个字符后退出。只要按下单个字符回答后,read命令就会接受输入并将它传给变量,无需按下回车键。
2.3 隐藏方式读取
当用户输入密码时,并不希望密码显示在显示器上。这是可以在read命令后跟‘-s’选项。
(其实,-s选项并不是真的不显示,只是read命令将文本颜色设置成跟背景色一样。)
2.4 从文件中读取
可以用read命令来读取Linux系统上文件里保存的数据。每次调用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"
While循环会持续通过read命令处理文件中的行,直到read命令以非0退出状态码退出。