介绍
使用过linux命令的都用过xxx -a --append -f a.tar.gz /etc/temp这种类型的命令
上面的命令包含了短选项、长选项、参数、选项参数
例如"-a"是短选项,"--append"是长选项,a.tar.gz是选项“-f”的选项参数(传递给选项的参数),/etc/temp则只是参数,为非选项参数
bash的getopt命令经常用在shell脚本内部或函数内部,用来解析脚本执行或函数执行时传递的选项、参数
getopt -o SHORT_OPTIONS -l LONG_OPTIONS -n "$0" -- "$@"
-o SHORT_OPTIONS 或 --options SHORT_OPTIONS
getopt通过“-o”收集传递的短选项和它们对应的参数
-l LONG_OPTIONS或--longoptions LONG_OPTIONS或--long LONG_OPTIONS
同上,长选项用-l或者后面2个
-n NAME
getopt在解析命令行时,如果解析出错则执行NAME脚本
-- "$@"
其中--表示getopt命令自身的选项到此结束,后面的元素都是要被getopt解析的命令行参数,"$@"表示所有命令行参数
getopt解析短选项时:
多个短选项开易连接在一起
如果某个短选项需要一个参数,则在选项后面跟一个冒号
如果某个短选项参数可选,则跟两个冒号
例如:getopt -o ab:c::,解析为:-a -b arg_b -c [arg_c] ,arg_b是"-b"选项必须的,arg_c是"-c"选项可选的,-a无须参数
getopt解析长选项时:
可以一次性指定多个选项名称,但是用逗号分开
可以多次使用-l选项,多次解析长选项
如果某个短选项需要一个参数,则在选项后面跟一个冒号
如果某个短选项参数可选,则跟两个冒号
例如:getopt -l add:,remove::,show,其实和上面的短选项类似,不做说明
getopt解析后处理
ARGS=`getopt -o hc:p:: --long help,case: -n 'run.sh' -- "$@"`
eval set -- "${ARGS}" #将规范化后的命令行参数分配至位置参数($1,$2,...)
while [ -n "$1" ]
do
case "$1" in #循环解析第一个参数
-h|--help)
test_run_help
;;
-c|--case)
case="$2"
shift
;;
-p)
case "$2" in
"") echo "Option p, no argument"; shift ;;
*) echo "Option p, argument \`$2'" ; shift ;;
esac ;;
--)
shift ;
break
;;
*)
break
esac
shift
done
./test.sh -c aa -pvv
Option p, argument `vv'
上面的命令中用到了eval、set和shift
eval
对其后面的命令再次进行shell解析
#:cat file
hello world
#:test = "cat file"
#:echo $test
cat file
#:eval $test #这里相当于二次解析了,执行了cat file命令
hello world
set --
根据分隔符依次把值赋给$1 $2 $3... ...
# cat test.sh
#!/bin/bash
echo $1 $2 $3
set -- aa bb cc #这里就被替换成了aa bb cc
echo $1 $2 $3
# sh test.sh a b c
a b c
aa bb cc
shift
将参数左移n个,可以理解成为删除前n个参数,即$1、$2。。。。。
# cat test.sh
#!/bin/bash
set -- aa bb cc
echo $1 $2 $3
shift 1 #这里删除$1,参数只剩bb cc
echo $1 $2 $3
# sh test.sh
aa bb cc
bb cc