Ich entschuldige mich, wenn mein Problem bereits in anderen Posts gestellt wurde, ich aber keine finden konnte. Ich schreibe Ein kleines Shell-Skript, bei dem ich eine verschachtelte if-Anweisung schreiben muss. Ich bin mir nicht sicher, ob ich es richtig mache. Ich erhalte keine Fehler, aber das Programm funktioniert nicht so, wie ich es erwartet habe. Was ich möchte ist: Wenn sich die Datei bereits in MasterFile.txt
befindet, hat der Benutzer die Möglichkeit, entweder einen anderen Datensatz zu übernehmen, indem er y
oder Y
oder sagen Sie n
oder N
, um das Programm zu beenden. Problem: Skript wird nicht beendet . Wenn die Datei in MasterFile.txt
nicht vorhanden ist, nehmen Sie den Datensatz. Hier ist der Code:
if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt; then { echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?" read string3 if "${string3}" = "Y" || "${string3}" = "y"; then { screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit } else{return} fi else{ #opening screen & begin analysis screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit } fi
Kommentare
- Ähm … welche Shell ist das?
sh
verwenden ' nicht{ ... }
für Blöcke. - implementiert habe. Jetzt erhalte ich eine Fehlermeldung, dass mit dem letzten Anweisung
- @Kusalananda, nun, Sie können sie sowohl dort als auch anderswo für die Befehlsgruppierung verwenden …
- @Ptheguy
if "${string3}" = 'Y'
verwendet den Inhalt vonstring3
als Namen eines Befehls und führt ihn mit zwei Argumenten aus:=
undY
…
ch glaube, es ist eine Bash. Das Programm hat mit nur einer if-Anweisung einwandfrei funktioniert. Ich glaube nicht, dass {...}
das Problem ist. Es muss etwas falsch mit der Art und Weise sein, wie ich das verschachtelte if
Antwort
Eine kurze Antwort Schreiben Sie mit konventionellerer Syntax:
if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt; then echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?" read string3 if [[ "${string3^}" == "Y" ]]; then screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit else exit 0 fi else #opening screen & begin analysis screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit fi
Hier scheinen keine Funktionen deklariert zu sein, also return
ist für diesen Anwendungsfall nicht gültig. Ich habe angenommen, dass eine nicht positive Antwort auf Ihre angeforderte Frage das gesamte Skript abbrechen soll, daher die Verwendung von exit
.
Das Konstrukt ${variable^}
erzwingt, dass das erste Zeichen von $variable
in Großbuchstaben geschrieben wird, was die Antwortprüfung vereinfacht.
Kommentare
- Also zwei Dinge: Eins, wenn ich
y
eingebe, wird es beendet, und unabhängig davon, was ich eingebe, bekomme ich das Nach dem folgenden Fehler./test/sh: line19: [[variable: command not found
- stellen Sie sicher, dass die erste Zeile des Skripts
#!/bin/bash
und nicht .[[ [...] ]]
Konstrukte sind einbash
Ismus. - Ja, der Header ist korrekt
- Und Sie haben ein Leerzeichen zwischen
[[
und"${string3^}"
? - Das war es !! Danke nochmal. Wenn Sie Zeit haben, haben Sie etwas dagegen, mir beizubringen, was
[[
bedeutet und warum ein Leerzeichen so wichtig sein kann?