Verschachtelte If-Anweisungen im Shell-Skript

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

  • 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 von string3 als Namen eines Befehls und führt ihn mit zwei Argumenten aus: = und Y

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 ein bash 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?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.