我有一个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
到目前为止一切正常,很好...
但是现在我想将其扩展到许多选项的列表中,因此与其写出一个长案例语句,不如以某种方式循环遍历选项列表并自动传递选项,将是非常不错的选择变量,沿着这些方向
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”,所以它们没有在循环中被切掉……我看不出一种明显的解决方法,但是我确定有一个。
答案 0 :(得分:1)
我意识到我仍然将shift命令放在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