我有一个bash脚本,我写了3个命令行选项,bib,bob和boo ...我想在用户选项中读入同名的bash变量,我这样做如下:
PARSED_OPTIONS=$(getopt -n $0 --long "bib:,bob:,boo:" -- "$@")
eval set -- "$PARSED_OPTIONS";
while true; do
case "$1" in
--bib)
bib=$2
shift 2;;
--bob)
bob=$2
shift 2;;
--boo)
boo=$2
shift 2 ;;
--)
shift
break;;
esac
done
这一切都很好,到目前为止,这么好......
但是现在我想将它扩展到许多选项的列表,所以不是写出一个长的case语句,能够以某种方式循环选项列表并自动将选项传递给变量真的很好,沿着这些方向
opts="bib:,bob:,boo:,"
PARSED_OPTIONS=$(getopt -n $0 --long $opts -- "$@")
for arg in `echo $opts | tr , " "` ; do
eval set -- "$PARSED_OPTIONS";
while true; do
case "$1" in
--${arg})
declare $arg=$2
shift 2
;;
--)
shift
break;;
esac
done
done
我正在使用声明语句将参数转换为同名的动态变量(参见Dynamic variable names in Bash第二个解决方案),这个解决方案用逗号分隔列表Loop through a comma-separated shell variable进行循环,但我在这里得到一个无限循环。我认为因为2个未使用的选项是允许的,因为它们在PARSED_OPTIONS列表中,但是它们不会在循环中被切掉,因为只查找“arg”...我看不到明显的方法,但是我敢肯定有一个。
我意识到我仍然将case命令放在case语句中,所以这就是为什么它没有退出。我还需要剥离冒号:从参数中,所以这是我的自动参数检索,用于运行的bash脚本:
# specify an arbitrary list of arguments:
opts=bib:,bob:,boo:
PARSED_OPTIONS=$(getopt -n $0 --long "${opts}" -- "$@")
for arg in ${opts//,/ } ; do
var=${arg//:} # remove the colon
eval set -- "$PARSED_OPTIONS";
while true ; do
case "$1" in
--${var})
declare ${var}=$2
;;
--)
break
;;
esac
shift 2
done
done
所以,如果你尝试test_script --boo 3 --bib hello --bob lkkfrfrfr
echo $bib $bob $boo
应该给
hello lkkfrfrfr 3