それがコマンドの構文の[
一部であると仮定するというよくある間違いを犯しています。if
そうではない; の構文if
は単純です
if command; then
... things which should happen if command's result code was 0
else
... things which should happen otherwise
fi
command
私たちがよく使う s の1 つは[
、コマンドのエイリアスですtest
。文字列、数値、およびファイルを比較するための単純なコマンドです。引数のかなり狭い組み合わせを受け入れるため、予期される引数を渡さないと、混乱を招き、誤解を招くエラー メッセージが生成される傾向があります。(というか、エラーメッセージは慣れれば十分ですが、慣れないと誤解されやすいです。)
あなたのmain
関数では、への呼び出し[
が間違っているように見えます。あなたはおそらく意味します
if function "$arg"; then
...
elif ... ; then ...
ところで、適切な方法として、常に文字列を引用する必要があります。の代わりに、およびを使用し"$1"
ないでください。$1
"$arg"
$arg
test
作成者がシンタックスの一部を作りたくないものの一般的なキッチン シンクとしての歴史的な理由if
は、オリジナルの Bourne シェルのあまり魅力的でないデザインの 1 つです。Bashを使用してzsh
、扱いにくい代替手段 (定義[[
で使用する bash の二重括弧などfunction1
) を提供します。もちろん、POSIXtest
は、Bell Labs のオリジナルの作成物よりもはるかに優れています。
追加の明確化として、関数を単純化して
function1 () {
! [[ "$1" =~ "^ ...some regexp... $" ]]
}
つまり、テストを実行し、[[
その結果コードを逆にします。(「通常の」ケースでは、成功すると 0 が返されますが、文字列が一致しないことを確認しようとしている可能性がありますか?)