読むケース条件付き構成のための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+
私のシステムにあります)ksh88
Schilyがこの会社で働いたことを確認しました。。
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スイッチボックスがどのように機能するかに関連している可能性があります。