Case ステートメントのインライン グループ化コマンドが機能しません: 予期しないマーカー ";;"近くに構文エラーがあります。

Case ステートメントのインライン グループ化コマンドが機能しません: 予期しないマーカー

私の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マニュアルセクションコマンドのグループ化

おすすめ記事