私のbashスクリプトからパラメータを解析します。特定のパターンなしで「path」という1つのパラメータのみを許可しようとしています。大文字と小文字が一致しない他のパラメーターはスクリプトを終了させます。例は次のとおりです。
#!/bin/bash
while [ "$#" -gt 0 ]; do
case "$1" in
-v|--verbose) verbose=1 ;;
-h|--help)
echo "Usage: $(basename "$0") [OPTIONS] [PATH]"
echo "Does something interesting with the given path."
echo ""
echo "OPTIONS"
echo " -v, --verbose Prints verbose information."
echo " -h, --help Prints this help message."
exit 0
;;
*) { test -z $path && path=$1 } || { echo "Invalid command line flag $1" >&2 && exit 1 } ;;
esac
shift
done
ただし、この行は{ test -z $path && path=$1 } || { echo "Invalid command line flag $1" >&2 && exit 1 } ;;
次の場合に失敗します。
myscript: line 14 syntax error near unexpected token `;;' myscript: line 14: ` *) { test -z $path && path=$1 } || { echo "Invalid command line flag $1" >&2 && exit 1 } ;;'
単にif-elseステートメントを書くことができることを知っていますが、インラインでグループ化できないのはなぜですか?中かっこを削除するとexit 1
常に到達します。
ベストアンサー1
1行のコマンドグループ内のコマンドのリストはセミコロンで終わる必要があります。{ list; }
そうでなければ{ list }
例えば、
$ bash -c 'case $1 in *) { echo foo && echo bar } ;; esac' bash baz
bash: -c: line 0: syntax error near unexpected token `;;'
bash: -c: line 0: `case $1 in *) { echo foo && echo bar } ;; esac'
失敗する、
$ bash -c 'case $1 in *) { echo foo && echo bar; } ;; esac' bash baz
foo
bar
効果がありました。
バラよりコマンドリストと}の間の区切り記号そしてbashマニュアルセクションコマンドのグループ化。