bash 腳本檢查輸入以查看它是否為“y”、“n”或其他 - 不起作用

bash 腳本檢查輸入以查看它是否為“y”、“n”或其他 - 不起作用

我編寫了這個 bash 腳本,旨在檢查您的輸入,看看它是否是yn其他內容(這將是一個更大專案的一部分):

#!/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和$responseif [$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 為它找不到的命令。將它們括在雙引號中,就像您將它們進行比較的字串一樣,它應該按預期工作。

相關內容