1 shell脚本的参数 2 参数扩展 |
1.shell脚本的参数
从命令行传递给脚本的参数称为位置参数。
变量名 | 说明 | 示例 |
---|---|---|
$n |
1≤n≤9,表示变量的位置顺序 n≥10 |
echo "$1" echo "${11}" |
$# | 命令行参数的个数 | echo "$#" |
$0 |
执行的脚本名称 脚本的文件名 |
echo "$0" echo "$0" | cut -d/ -f2 |
$* | 返回所有参数的值 |
echo "$*" 以"$1 $2 … $n"的形式输出 |
$@ | “同上”,输出形式略有不同 |
echo "$@" 以"$1" "$2" … "$n" 的形式输出 |
$_ | 代表之前执行的命令的最后一个参数 |
示例,比较$@、$*,脚本haha.sh代码如下:
#!/bin/bash
tmp=""
declare -i k=0
for i in "$@"; do
let k+=1
echo "Cycles: $k"
tmp=${tmp}"$(echo $i)"
done
echo "$tmp"
如第三行,执行后输出:
$ ./haha.sh hello sunny ! Cycles: 1 Cycles: 2 Cycles: 3 hellosunny!
修改成$*,执行后如下:
$ ./haha.sh hello sunny Cycles: 1 hello sunny !
倘若去掉第三行的双引号,输出结果都是一样的,如下:
$ ./haha.sh hello sunny ! Cycles: 1 Cycles: 2 Cycles: 3 hellosunny!
这个例子,说明:第5行如果不带双引号的情况下,$*、$@效果一样。带了双引号,会影响程序的执行。带上双引号后,“$*”就是一个字符串;而“$@”才能准确地表示脚本的多个变量。
上边的情况是,选项不带空格符“hello world.”,第5行“"$@"”,结果是:
Cycles: 1 hello world.
去掉第5行的双引号:
Cycles: 1 Cycles: 2 helloworld.
说明带上双引号,才能正确表示选项。
总结如下表,+表示带上双引号、-表示不带、√表示正确处理、╳处理表示错误。
位参 | 命令 | $@ | $* | 说明 |
---|---|---|---|---|
+ | + | √ | √ |
位参中包含空格 |
+ | - | ╳ | ╳ | |
- | - | √ | √ | |
- | + | √ | ╳ | 程序中需要使用双引号时,选择$@ |
2.参数扩展
给脚本传递多个不同值的“同位”参数。这里需要引入“getopts”命令来完成参数扩展。 getopts的使用,有个前提:认为选项不会出现在“?”、“:”之中。
2.1.语法
getopts的语法:getopts 选项定义 选项变量名 [args]
“选项定义”用来设定接受的选项列表。当列表中某个字符后带着“:”时,代表其需要一个参数。
“选项变量名”用来接收脚本的选项。
[args]表示,……。(不清楚,找不到合适的解释,有解释的但是没有用法,无法验证,暂略)
“选项参数”保存在变量OPTARG中,获取到最后一个参数的时候,getopts的返回值“为假”。
如果“选项定义”首个字符是“:”就关闭了报错机制(静默模式)。也可以使用变量“OPTERR”(设置为0)关闭报错,优先级更高。
2.2.异常
出现非法选项,变量名被赋值“?”。非静默模式时,输出错误信息,不处理变量OPTARG。静默模式时,非法选项字符被赋值给变量OPTARG。
缺少参数时,非静默模式情况下“选项变量名”被赋值“?”,不处理OPTARG,输出错误信息。静默模式,“选项变量名”被赋值“:”,OPTARG被赋值“选项字符”。
当从脚本获取到选项时,getopts返回为真。 带有参数的选项缺少参数时,返回就为 false。这段程序,完美演绎了变量 OPTIND 的效果。
while getopts ":h:d:Dn:f:" opt; do echo "<<< opt = $opt >>>" case "$opt" in # Valid options. "h") echo -e " Destination hosts: $OPTARG." echo -e " $OPTIND is $OPTIND" ;; "d") echo -e " Will download file $OPTARG." echo -e " $OPTIND is $OPTIND" ;; "D") echo -e " Will download all item directory." echo -e " $OPTIND is $OPTIND" ;; "n") echo -e " Create new directory $OPTARG." echo -e " $OPTIND is $OPTIND" ;; "f") echo -e " When replaced, specify a new file name. $OPTARG." echo -e " $OPTIND is $OPTIND" ;; ":") # Silent, without arg echo -e " Option $OPTARG has't parameter." echo -e " $OPTIND is $OPTIND" ;; "?") # Not silent, without arg. And invalid option. echo -e " Invalid option $OPTARG." echo -e " $OPTIND is $OPTIND" ;; "*") # Impossible to implement. echo -e " unkown error from arg." echo -e " $OPTIND is $OPTIND" ;; esac done
看看这段代码的运行效果
# 完整效果
[view@file milo]$ bin/milo -h app47,app160,zcw -d *.properties -D -n web/newHtml/memberList/img -f *.png
<<< opt = h >>>
Destination hosts: app47,app160,zcw.
$OPTIND is 3
<<< opt = d >>>
Will download file *.properties.
$OPTIND is 5
<<< opt = D >>>
Will download all item directory.
$OPTIND is 6
<<< opt = n >>>
Create new directory web/newHtml/memberList/img.
$OPTIND is 8
<<< opt = f >>>
When replaced, specify a new file name. *.png.
$OPTIND is 10
# -f 选项缺少参数
[view@file milo]$ bin/milo -h app47,app160,zcw -d *.properties -D -n web/newHtml/memberList/img -f
<<< opt = h >>>
Destination hosts: app47,app160,zcw.
$OPTIND is 3
<<< opt = d >>>
Will download file *.properties.
$OPTIND is 5
<<< opt = D >>>
Will download all item directory.
$OPTIND is 6
<<< opt = n >>>
Create new directory web/newHtml/memberList/img.
$OPTIND is 8
<<< opt = : >>>
Option f has't parameter.
$OPTIND is 9
# -h 选项缺少参数,-h 选项位于所有选项的最前面
[view@file milo]$ bin/milo -h -d *.properties -D -n web/newHtml/memberList/img -f
<<< opt = h >>>
Destination hosts: -d.
$OPTIND is 3
# 某个选项缺少参数时,程序终止执行
# 缺少参数时都会终止运行,但进入的分支有差异
[view@file milo]$ bin/milo -f
<<< opt = : >>>
Option f has't parameter.
$OPTIND is 2
项目 | 意义 |
---|---|
getopts | 命令 |
":ln:" |
选项定义,定义脚本处理的选项列表 |
opt |
选项变量名,捕获脚本执行时使用的选项 |
项目 | 意义 |
---|---|
: | 选项定义首个字符是冒号时,代表getopts运行在静默模式。 |
l | 定义了一个无参数的选项 l |
n: | 定义带参数的选项 n |
执行效果 | ||
---|---|---|
$ ./my-getopts.sh -l option l |
选项 l | 处理选项 l |
$ ./my-getopts.sh -n
No arg. |
省略参数的选项 n | 在循环中使用“:”处理忘记了参数的选项 |
$ ./my-getopts.sh -n 3
option n has vlaue 3 |
带参数 3 的选项 n | 处理 选项 n 及 n 的值 3 |
$ ./my-getopts.sh -k invalid arg. |
未定义的选项 | ? |
2.3.试数
探测下运行机制……
#!/bin/bash declare -i sw=0 while getopts ":abc" option do echo "option is ${option}." echo "OPTARG is ${OPTARG}." echo "OPTIND is ${OPTIND}." sw=1 done # Without option [ $sw -eq 0 ] && echo "without any option?" && echo "OPTIND is ${OPTIND}."
改进意见:例子清晰,针对不同选项使用的测试效果清楚