这可能是一个明显的错误,但我只是没有看到它。我有一个 case 语句,应该能够将参数传递给脚本(例如script.sh --verbose --all
:)。
由于某种原因,这个特定的函数无法正常工作 - 它只适用于我首先传递的标志:
#Pass arguments to the script
flags()
{
while test $# -gt 0
do
case "$1" in
(-v|--verbose)
shift
export VERBOSE="1"
shift;;
(-vv|--extra-verbose)
shift
export VERBOSE="1"
export EXTRA_VERBOSE="1"
shift;;
(-a|--all)
shift
export ALL="1"
shift;;
(-h|--help)
usage;;
(*) usage;;
esac
done
}
flags "$@"
echo "Verbose: $VERBOSE, Extra Verbose: $EXTRA_VERBOSE, All: $ALL"
所以在这种情况下,如果我通过-v -a
,脚本只会设置$VERBOSE
变量。如果我通过-a -v
,脚本将只设置$ALL
变量。
我有很多使用这种结构的脚本,但它们没有表现出这一点。
如果您能帮我弄清楚我错过了什么,我将非常感激。
谢谢!
答案1
你有太多了shift
。它应该只执行一次,在处理完一个参数后,你可以转向下一个。
#!/bin/sh
#Pass arguments to the script
flags()
{
while test $# -gt 0
do
case "$1" in
-v|--verbose)
export VERBOSE="1"
;;
-vv|--extra-verbose)
export VERBOSE="1"
export EXTRA_VERBOSE="1"
;;
-a|--all)
export ALL="1"
;;
-h|--help)
usage;;
*) usage;;
esac
# and here we shift to the next argument
shift
done
}
flags "$@"
echo "Verbose: $VERBOSE, Extra Verbose: $EXTRA_VERBOSE, All: $ALL"