假设我有一个用选项
调用的脚本a.sh
a.sh -a1 a1option -a2 a2option
假设我还有一个脚本b.sh
,它调用a.sh
并使用自己的选项。因此用户按如下方式执行脚本:
b.sh -b1 b1option -b2 b2option -a1 a1option -a2 a2option
现在我想知道如何解析b.sh
中的命令行选项。
我不需要解析整个命令行。我不希望b.sh
知道选项a1
和a2
。我想只获取选项b1
和b2
,并将其余传递给a.sh
。
你会怎么做?
答案 0 :(得分:4)
根据要求,此方法可避免解析整个命令行。仅为--
收集了b.sh
以前的参数。然后剥离b的参数,只将剩余的参数传递给a.sh
。
b.sh
调用 b.sh -b b1option -B b2option -- -a1 a1option -a2 a2option
。在此行中,双短划线--
表示b.sh
的选项结束。以下内容解析--
之前的选项以供b.sh
使用,然后从$@
中删除b参数,以便您可以将其传递给a.sh
而无需担心错误{ {1}}可能会给你。
a.sh
注意:此方法使用bash内置的getopts。 Getopts(与getopt相反,没有s)只采用单字符选项;因此,我使用while getopts ":b:B:" opt; do
case $opt in
b) B1=${OPTARG}
;;
B) B2=${OPTARG}
;;
esac
done
## strips off the b options (which must be placed before the --)
shift $(({OPTIND}-1))
a.sh "$@"
和b
代替B
和b1
。
我最喜欢的getopts参考。
答案 1 :(得分:2)
您可以这样做:
#!/bin/bash
while [[ $# -gt 0 ]]; do
case "$1" in
-b1)
B1=true
B1OPT=$2
shift
;;
-b2)
B2=true
B2OPT=$2
shift
;;
--)
shift
break
;;
*)
echo "Invalid option: $1"
exit 1 ## Could be optional.
;;
esac
shift
done
bash a2.sh "$@"
请注意,您应该将变量$@
置于双引号内,以防止在展开时进行单词拆分。
答案 2 :(得分:1)
如果a.sh可以忽略它不知道的选项,你只需调用b.sh所有选项就可以调用它:
a.sh "${@}"