我編寫了這個 bash 腳本,旨在檢查您的輸入,看看它是否是y
或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'.
那我的程式碼有什麼問題嗎? (我對 shell 腳本非常陌生。)
答案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 行有一個簡單的錯誤[
。。同樣,第 9 行的for和$response
if [$response = "y"]then
[
$response
此外,您還必須使用雙引號$response
以避免使用者輸入帶有空格的輸入時發生錯誤。
答案3
而且,該set
命令比您想像的更加奇特。您不使用該set
命令來設定變數。
您知道,當您使用參數呼叫 shell 腳本時,它們會被指派給 $1
, $2
, $3
, ...;正確的?出色地,
一該命令所做的事情之一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"
它尋找一個名為 的程式=
。更糟的是, if$checkpoint
已經設定為"t"
,而你說
$checkpoint="f"
那麼這被解釋為
t="f"
從而設定變數t
(即$t
)。
答案4
Bash 將您的命令解釋$response
為它找不到的命令。將它們括在雙引號中,就像您將它們進行比較的字串一樣,它應該按預期工作。