入力が「y」、「n」、またはその他の値であるかどうかを確認する bash スクリプト - 動作しません

入力が「y」、「n」、またはその他の値であるかどうかを確認する bash スクリプト - 動作しません

y私は、入力が であるか、または何か他のものであるかをチェックするための bash スクリプトを作成しましたn(これは、より大きなプロジェクトの一部になります)。

#!/bin/bash

echo "Have you updated the PATH variable in your .bashrc file yet? [y/n]"
read response

        if [$response = "y"]; then
                echo "Checkpoint passed"
                set $checkpoint = "t"
        elif [$response = "n"]; then
                echo "Please set the PATH variable in your .bashrc file before running this script."
                set $checkpoint = "f"
        else            
                echo "Please only use 'y' and 'n'."
                set $checkpoint = "f"
        fi

しかし、何を入力しても実行するたびに次のようなエラーが発生します。

Have you updated the PATH variable in your .bashrc file yet? [y/n]
y
./snbjdkhome: line 6: [y: command not found
./snbjdkhome: line 9: [y: command not found
Please only use 'y' and 'n'.

それで、私のコードの何が間違っているのでしょうか? (私はシェル スクリプトの初心者です。)

答え1

これにより明確になります (空白を確認してください):

$ var=c

$ ["$var" == "c"] && echo "OK"
[c: command not found

$ ["$var" == "c" ] && echo "OK"
[c: command not found

$ [ "$var" == "c"] && echo "OK"
bash: [: missing `]'

$ [ "$var" == "c" ] && echo "OK"
OK

testしたがって、 ( ) コマンドを使用するときは、条件の前後に空白を入れる必要があります[ ]

答え2

[6行目と9行目に単純な誤りがあります。6行目のと$responseの間にはスペースが必要ですif [$response = "y"]then。同様に、9行目の[とについても、$response

$responseまた、ユーザーがスペースを含む入力を行った場合にエラーが発生しないように、二重引用符で囲む必要があります。

答え3

また、このsetコマンドはあなたが思っているよりも特殊です。set変数を設定するためにこのコマンドを使用するわけではありません。

シェルスクリプトをパラメータ付きで呼び出すと、パラメータが、、、…に割り当てられることはご存知です よ$1ね? $2$31つコマンドが行うことの1つは、、、、…setを設定することです 。$1$2$3現在 (対話型)シェル。例えば、

% set checkpoint="y"
% echo "$checkpoint"
                                (nothing)
% echo "arg1 = '$1', arg2 = '$2', arg3 = '$3'"
arg1 = 'checkpoint=y', arg2 = '', arg3 = ''
% set checkpoint = "y"
% echo "$checkpoint"
                                (nothing)
% echo "arg1 = '$1', arg2 = '$2', arg3 = '$3'"
arg1 = 'checkpoint', arg2 = '=', arg3 = 'y'

それはあなたが望んでいることではありません。

そして、もうひとつ問題があります。正しい構文は

checkpoint="t"

あなたが言うなら

$checkpoint="t"

$checkpoint設定されていない場合、このコマンドは次のように短縮されます。

="t"

=tこれは(おそらく存在しない)というプログラムを探します。同様に、

$checkpoint = "t"

減少する

= "t"

これは というプログラムを探します=。さらに悪いことに、$checkpointがすでに に設定されている場合"t"、次のように言います。

$checkpoint="f"

それは次のように解釈される

t="f"

したがって、変数t(つまり、$t) が設定されます。

答え4

Bash は、$response 見つけられないコマンドとして解釈します。比較する文字列と同様に二重引用符で囲むと、期待どおりに動作するはずです。

関連情報