Frage Bash-Skript, das die Eingabe überprüft, um zu sehen, ob es "y", "n" oder andere ist - funktioniert nicht


Ich habe dieses Bash-Skript geschrieben, das Ihre Eingabe überprüfen soll, um zu sehen, ob es ist y, n oder etwas anderes (dies wird Teil eines größeren Projekts sein):

#!/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

Aber jedes Mal, wenn ich es ausführe, bekomme ich einen Fehler, der dem ähnelt, egal was ich hineinlege:

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'.

Was ist also falsch an meinem Code? (Ich bin sehr neu im Shell-Scripting.)


0
2018-03-15 15:22


Ursprung


mywiki.wooledge.org/ ...... auch wenn Sie Menüs erstellen, verwenden Sie case (vorzugsweise mit select). - muru


Antworten:


Dies wird Ihnen klar machen (Überprüfen Sie die Whitespaces):

$ 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

Daher müssen Sie vor und nach der Bedingung Whitespace während der Verwendung einfügen test ([ ])Befehl.


5
2018-03-15 15:41





In Zeile 6 und 9 gibt es einen einfachen Fehler. Zwischen den beiden Zeilen sollte ein Leerzeichen stehen [ und $response im if [$response = "y"]then in Zeile 6; . In ähnlicher Weise, z [ und $response in Zeile 9`

Außerdem müssen Sie doppelte Zahlen angeben $response um Fehler zu vermeiden, falls der Benutzer eine Eingabe mit Leerzeichen eingibt.


4
2018-03-15 15:30





Auch der set Befehl ist exotischer als du denkst. Du verwendest das nicht set Befehl zum Setzen von Variablen.

Sie wissen, dass beim Aufruf eines Shell-Skripts mit Parametern denen sie zugewiesen werden$1, $2, $3, ...; Recht? Gut, ein der Dinge die set Befehl ist zu setzen$1, $2, $3, ... für die Strom(interaktive) Hülle. Also zum Beispiel

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

was ist nicht was du willst.

Und du hast ein anderes Problem. Die korrekte Syntax ist

checkpoint="t"

Wenn du sagst

$checkpoint="t"

und $checkpoint ist nicht gesetzt, reduziert sich dieser Befehl auf

="t"

was nach einem Programm namens sucht =t (was wahrscheinlich nicht existiert). Ähnlich,

$checkpoint = "t"

reduziert zu

= "t"

was nach einem Programm namens sucht =. Noch schlimmer, wenn $checkpoint ist bereits eingestellt auf "t", und du sagst

$checkpoint="f"

dann wird das als interpretiert

t="f"

somit die Variable einstellen t (d. h. $t).


3
2018-03-16 03:32





Bash interpretiert deine $response  als Befehle kann es nicht finden. Schließen Sie sie in doppelte Anführungszeichen ein, wie die Zeichenfolgen, mit denen Sie sie vergleichen, und es sollte wie erwartet funktionieren.


1
2018-03-15 15:31