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
$3
1つコマンドが行うことの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
見つけられないコマンドとして解釈します。比較する文字列と同様に二重引用符で囲むと、期待どおりに動作するはずです。