14.4.2 使用getopt命令
它能够识别命令行参数,从而在脚本中解析它们。
1.命令的格式
可以接受一系列任意形式的命令行选项和参数,并自动将它们转换成命令行参数。
命令格式如下:
getopt optstring parameters
optstring:定义了命令行有效的选项字母,还定义了哪些选项字母需要参数值
比如:
$getopt ab:cd –a –b testb –cd test2 test3
b后面接了冒号:说明-b选项需要参数。
后面 –cd 会被自动拆分成 –c -d 两个单独的选项
还会插入双破折线来分割行中的额外参数。
2.在脚本中使用getopt
可以在脚本中使用getopt来格式化脚本所携带的任何命令行选项或者参数,用起来略繁琐。
方法是:用getopt命令生成的格式化后的版本来替换已有的命令行参数和选项。
用set命令可以做到。需要的选项之一就是 双破折号 --。它会将命令行参数替换成set命令的命令行值。
但是这个不擅长处理带空格和带引号的参数值,它会将空格当做参数分隔符,而不是根据双引号将二者当做一个参数
例子:
1 #!/bin/bash
2 echo
3 set -- $(getopt -q ab:cd: "$@")
4 while [ -n "$1" ]
5 do
6 case "$1" in
7 -a) echo "Found the -a option";;
8 -b) value=$2
9 echo "Found the -b option, Param = $value"
10 shift;;
11 -c) echo "Found the -c option";;
12 -d) value=$2
13 echo "Found the -d option, Param = $value"
14 shift;;
15 --) shift
16 break;;
17 *) echo "$1 is not option";;
18 esac
19 shift
20 done
21
22 count=1
23 for param in $@
24 do
25 echo "Param$count = $param"
26 count=$[ $count + 1 ]
27 done
运行:
3. 使用更高级的getopts
getopt将命令行上选项和参数的处理结后只生成一个输出。
getopts能够和已有的shell参数变量配合默契。
每次调用它时,它一次只处理命令行上检测到的一个参数。处理完所有的参数后,会退出并返回一个大于0的退出状态码。这样就可以循环了。
格式如下:
getopts optstring variable
如果选项有参数就在后面加冒号
要去掉错误消息就在前面加冒号。
getopts会用到两个环境变量:
OPTARG:会保存一个参数值
OPTIND:保存参数列表中getopts正在处理的参数位置。
getopts知道何时停止处理选项,并且把参数留给你处理。
每处理一个选项,OPTIND就会增1,处理完选项时就可以用shift来移动参数。从而处理参数。
例子:
1 #!/bin/bash
2 echo
3 while getopts :ab:c opt
4 do
5 case "$opt" in
6 a) echo "Found -a option";;
7 b) echo "Found -b option, with value:$OPTARG";;
8 c) echo "Found -c option";;
9 *) echo "Unkonw option: $opt"
10 esac
11 done
12
13 echo
14 echo "OPNTING = $OPTIND"
15 shift $[ $OPTIND - 1 ] #这里开始处理参数,先移动参数
16 count=1
17 for param in "$@"
18 do
19 echo "Param$count = $param"
20 count=$[ $count + 1 ]
21 done
运行: