shell脚本如何传递给子脚本命令行参数
shell脚本可以使用getops来分析命令行参数,现在的一个使用场景是:
- 有一个入口脚本,接受命令行用户输入。
- 父脚本处理部分命令行参数,根据其中的部分参数值,来决定调用哪一个子脚本,然后把剩下的参数传递给子脚本解析:
例如:
父脚本:
function help() {
echo "Usage: $0 -t type ..."
exit
}
TYPE=""
while getopts 't:h' OPT; do
case $OPT in
t)
TYPE="$OPTARG"
break # must break for last parent-script
;;
*)
help
;;
esac
done
shift $(($OPTIND - 1))
case $TYPE in
sub)
./sub.sh -t "TTT" ${*}
;;
*)
help
;;
esac
父脚本处理一个参数-t,如果-t的值是sub,那么调用sub.sh子脚本,然后把剩下的参数连同重写的-t参数传递给子脚本sub.sh。
子脚本:
function help() {
echo "Usage: $0 -c command ..."
exit
}
TYPE=""
COMMAND=""
while getopts 't:c:h' OPT; do
case $OPT in
t)
TYPE="$OPTARG"
;;
c)
COMMAND="$OPTARG"
break # import to skip other options
;;
*)
help
;;
esac
done
shift $(($OPTIND - 1))
echo "$0: type=[${TYPE}], command=[${COMMAND}], args=[${*}]"
子脚本的参数处理就没啥特殊的 了,和普通的脚本处理命令行参数一样。
运行例子:
$ ./main.sh
Usage: ./main.sh -t type ...
$ ./main.sh -d avalue
./main.sh: 非法选项 -- d
Usage: ./main.sh -t type ...
$ ./main.sh -t sub
./sub.sh: type=[TTT], command=[], args=[]
$ ./main.sh -t sub -c cmd
./sub.sh: type=[TTT], command=[cmd], args=[]
$ ./main.sh -t sub -c mycmd -d mydata anyvalue anyvalue2
./sub.sh: type=[TTT], command=[mycmd], args=[-d mydata anyvalue anyvalue2]
限制:
- 父脚本处理的参数必须放在最前面。
- 父脚本必须显式指定其处理的最后一个参数。
在处理完这个最后参数之后必须加break语句,从而放弃对剩余参数的分析,让他们传递给子脚本。
网友评论