Ich habe dieses Bash-Skript geschrieben, das Ihre Eingabe überprüfen soll, um festzustellen, ob es sich um y
oder n
etwas 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
test
Sie 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 $response
in ein Leerzeichen gesetzt werden if [$response = "y"]then
. Ebenso für [
und $response
in Zeile 9`
Sie müssen außerdem doppelte Anführungszeichen setzen, $response
um Fehler zu vermeiden, falls der Benutzer eine Eingabe mit Leerzeichen macht.
Antwort3
Außerdem set
ist der Befehl exotischer als Sie denken. Sie verwenden den set
Befehl nicht, um Variablen festzulegen.
Sie wissen, dass, wenn Sie ein Shell-Skript mit Parametern aufrufen, diese $1
, $2
, $3
, … zugewiesen werden, richtig? Nun,
einsDer set
Befehl 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 $checkpoint
nicht 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 $checkpoint
bereits 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.