POSIX sh は、最初の条件で空の複合リストを受け入れ、ケース条件構成で空の条件を受け入れますか?

POSIX sh は、最初の条件で空の複合リストを受け入れ、ケース条件構成で空の条件を受け入れますか?

読むケース条件付き構成のためのPOSIX仕様、理解します:

case word in
    [(]pattern1) compound-list;;
    [[(]pattern[ | pattern] ... ) compound-list;;] ...
    [[(]pattern[ | pattern] ... ) compound-list]
esac

私が知る限り、の本文には少なくとも一つの条件が存在し、caseそのcompound-list条件に該当する条件が必ず存在しなければなりません。

私はクイックテストを書いた。

$ cat test.sh
case $1 in
esac

case $1 in
  .) ;;
  *) echo 1
esac

それから:

$ for shell in /bin/*sh; do
    printf '=%-18s=\n' "$shell"
    "$shell" ./test.sh .
  done
=/bin/ash          =
=/bin/bash         =
=/bin/dash         =
=/bin/heirloom-sh  =
=/bin/ksh          =
=/bin/lksh         =
=/bin/mksh         =
=/bin/pdksh        =
=/bin/posh         =
=/bin/schily-osh   =
=/bin/schily-sh    =
=/bin/sh           =
=/bin/yash         =
=/bin/zsh          =

/bin/heirloom-shはいガボツールボックスのBourneシェル/bin/schily-sh and /bin/schily-oshはいシェリーボーンシェル)

これは私を驚かせた!私が知っているすべてのシェルはこの構文を受け入れます。そして:

case $1 in esac

上記のすべてのシェルで動作しますがksh(これはksh93u+私のシステムにあります)ksh88Schilyがこの会社で働いたことを確認しました。

POSIXはこれを許可しますか、それとも何か抜けましたか?

ベストアンサー1

役に立つ場合、構文規則は次のとおりです。よく読めませんが、そうです。そうだ許可済み - それぞれについてパターン+リスト別のケースがありますモード+割り込みケース。 3番目は完全に去ることができることを示すようです。パターン化されていない。リンクはここ


case_clause      : Case WORD linebreak in linebreak case_list    Esac
                 | Case WORD linebreak in linebreak case_list_ns Esac
                 | Case WORD linebreak in linebreak              Esac
                 ;
case_list_ns     : case_list case_item_ns
                 |           case_item_ns
                 ;
case_list        : case_list case_item
                 |           case_item
                 ;
case_item_ns     :     pattern ')'               linebreak
                 |     pattern ')' compound_list linebreak
                 | '(' pattern ')'               linebreak
                 | '(' pattern ')' compound_list linebreak
                 ;
case_item        :     pattern ')' linebreak     DSEMI linebreak
                 |     pattern ')' compound_list DSEMI linebreak
                 | '(' pattern ')' linebreak     DSEMI linebreak
                 | '(' pattern ')' compound_list DSEMI linebreak

とにかく - 私には効果があるでしょう。以下はうまくいきます:

x=
if $x; then $x; else echo this doesnt happen; fi

...構文解析時にコマンドが空ではなく、シェルに何かすることがあるためです。私は常にスキーマを添付リストに直接関連付けます。実際、彼らはとてもよく似合います。

x=0
for z in a b c d e f g
do    case $z in [abcd]) ;; $((x+=1))) ;; esac
done; echo "$x"

3

仕様は、拡張順序とパターンリストの関連付けについて非常に明確です。私はいつも自然に2つを組み合わせて、ある程度1つのコマンドとして扱いました。では、皮のためするその箱を確認すること。これは、Cスイッチボックスがどのように機能するかに関連している可能性があります。

おすすめ記事