Bash-Skript, das die Eingabe überprüft, um festzustellen, ob sie "y", "n" oder etwas anderes ist - funktioniert nicht

Bash-Skript, das die Eingabe überprüft, um festzustellen, ob sie "y", "n" oder etwas anderes ist - funktioniert nicht

Ich habe dieses Bash-Skript geschrieben, das Ihre Eingabe überprüfen soll, um festzustellen, ob es sich um yoder netwas anderes handelt (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, erhalte ich unabhängig von den Eingaben einen Fehler ähnlich diesem:

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 ein völliger Neuling im Shell-Scripting.)

Antwort1

Dadurch wird Folgendes deutlich (überprüfen Sie die Leerzeichen):

$ 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

testSie müssen also beim Verwenden des ( [ ])-Befehls vor und nach der Bedingung Leerzeichen einfügen .

Antwort2

es gibt einen einfachen Fehler in Zeile 6 und 9. In Zeile 6 sollte zwischen [und $responsein ein Leerzeichen gesetzt werden if [$response = "y"]then. Ebenso für [und $responsein Zeile 9`

Sie müssen außerdem doppelte Anführungszeichen setzen, $responseum Fehler zu vermeiden, falls der Benutzer eine Eingabe mit Leerzeichen macht.

Antwort3

Außerdem setist der Befehl exotischer als Sie denken. Sie verwenden den setBefehl nicht, um Variablen festzulegen.

Sie wissen, dass, wenn Sie ein Shell-Skript mit Parametern aufrufen, diese  $1, $2, $3, … zugewiesen werden, richtig? Nun, einsDer setBefehl setzt  unter anderem $1, $2, $3, … für dieaktuell (interaktive) Shell. So zum Beispiel

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

und das ist nicht, was Sie wollen.

Und Sie haben noch ein weiteres Problem. Die korrekte Syntax lautet

checkpoint="t"

Wenn du sagst

$checkpoint="t"

und $checkpointnicht gesetzt ist, reduziert sich dieser Befehl auf

="t"

das nach einem Programm namens =t(das wahrscheinlich nicht existiert) sucht. Ebenso

$checkpoint = "t"

reduziert zu

= "t"

das nach einem Programm namens sucht =. Noch schlimmer ist es, wenn $checkpointbereits auf eingestellt ist "t"und Sie sagen

$checkpoint="f"

dann wird das interpretiert als

t="f"

Dadurch wird die Variable t(dh $t) festgelegt.

Antwort4

Bash interpretiert Ihre Befehle $response als Befehle, die es nicht finden kann. Setzen Sie sie in Anführungszeichen, genau wie die Zeichenfolgen, mit denen Sie sie vergleichen, und es sollte wie erwartet funktionieren.

verwandte Informationen