![Bashは関数の引数をプログラムとして認識します](https://rvso.com/image/1665759/Bash%E3%81%AF%E9%96%A2%E6%95%B0%E3%81%AE%E5%BC%95%E6%95%B0%E3%82%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%8D%E8%AD%98%E3%81%97%E3%81%BE%E3%81%99.png)
私は bash の構文についてかなり初心者で、'.bash_aliases' ファイルにコードがあります。引数として整数または文字 'c' を受け取ります。整数を受け取ると、その整数が環境変数に格納され、Web サーバーがポートとして使用できます。入力として文字 'c' を受け取ると、変数がクリアされます。
整数でコマンドを実行しようとするとエラーが発生します
main@linuxWSL:~$ serverp 2000
-bash: [: missing `]'
2000: command not found
そして文字「c」で試してみると
main@linuxWSL:~$ serverp c
-bash: [: missing `]'
c: command not found
これは私の bash コードです:
serverp () {
if [ "$1" = "clear" || "$1" = "c" ]
then
unset PORT
echo -e "\e$CLEAR$GREEN""mWebServer port has been reset!""$CLEAN"
return 0
fi
export PORT="$1"
}
誰か助けてくれませんか? ありがとう!
答え1
[
は、シェル パーサーがコマンド ラインの残りの部分を異なる方法で解釈するようにする Bash のキーワードではありません。 は、またはの[
ようなコマンドです。(のような) は Bash の組み込みですが、これは追加のプロセスを生成せずに実行できることを意味するだけであり、依然としてコマンドのように動作します。cat
echo
[
echo
明確に言うと、は構文[ … ]
の一部ではありません。単にコードの終了ステータスをテストするだけです。有効、有効、同様に有効です (その部分自体が有効なコマンドである場合)。if … then …
if
if true; then …
if sleep 5; then …
if [ … ]; then …
[ … ]
[
おそらく、システムには実行可能ファイルがあります。 を試してくださいtype -a [
。 と比較してくださいtype -a [[
。 とは対照的に[
、[[
は Bash のキーワードであり、パーサーが[[
との間にあるものを]]
特別に扱うようにします。
[
はキーワードではありません。は最後の引数だけである[ … ]
コマンドは適切に記述されます。 は最後の引数として必要であり、そうでない場合は動作しません。 これは、 が特別な構文であるかのようにブロックとして目立つようにするためだけのものですが、特別な構文ではありません。]
[
]
[ … ]
は[ "$1" = "clear" || "$1" = "c" ]
シェルによって と解釈され、[ "$1" = "clear"
と"$1" = "c" ]
接続されます||
。したがって、コマンドは 2 つあります。最初のコマンドは で[ "$1" = "clear"
、 が[
実行され、 が最後の引数として取得されないため]
、エラーが発生し、ゼロ以外の終了ステータスで終了します。 がゼロ以外のステータスであり、 のため||
、シェルは に展開されるもので始まる 2 番目のコマンドを実行しようとします"$1"
。このように、スクリプトの最初の引数は、実行する実行可能ファイルとして解釈されます。
次のように修正します[ … || … ]
:
[ "$1" = "clear" ] || [ "$1" = "c" ]
このスニペットは2つの有効 [
コマンド。希望どおりに動作するはずです。
は[[ "$1" = "clear" || "$1" = "c" ]]
動作するコードですが、は動作しません。これはがコマンドではない[ "$1" = "clear" || "$1" = "c" ]
ためです。これはキーワードであり、シェルパーサーが までのすべてを特別に扱うようにします。これには も含まれます。他にも[[
]]
||
[[
との違い[
盲目的に交換しないでください。
[
Bashの組み込み関数は-o
、または-a
(そしてそして)なので、これも機能します:
[ "$1" = "clear" -o "$1" = "c" ]
||
これは、(シェルに特有)が-o
(シェルに特有ではない)に置き換えられたコードです。-o
ただし、これは避けるべきです。この記事:
バイナリ
-a
および-o
[…] は、POSIX 標準の XSI 拡張です。これらはすべて、POSIX-2008 で廃止予定としてマークされています。新しいコードでは使用しないでください。[ A = B -a C = D ]
(または) の実際的な問題の 1 つは、POSIX では 4 つ以上の引数を持つorコマンド-o
の結果が指定されていないことです。これはほとんどのシェルで動作すると思われますが、当てにはなりません。POSIX シェル用に記述する必要がある場合は、代わりに演算子で区切られた 2 つのorコマンドを使用する必要があります。test
[
test
[
&&
記事では について詳しく説明しているので-a
、「&&
代わりに演算子」であることに注意してください。あなたの場合は、それぞれ と です-o
。演算子||
で区切られた 2 つのテストが||
まさに私たちの解決策です。
答え2
そのif [ "$1" = "clear" ] || [ "$1" = "c" ]
。