이것은 아마도 명백한 버그일 것입니다. 그러나 나는 그것을 보지 못합니다. 스크립트에 인수를 전달할 수 있어야 하는 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"