Nestet Hvis udsagn i Shell Script

Jeg undskylder, hvis mit problem allerede er blevet spurgt i andre indlæg, men jeg ikke kunne finde nogen. Jeg skriver et lille shell-script, som kræver, at jeg skriver en indlejret if-sætning. Jeg er ikke helt sikker på, at jeg gør det rigtigt. Jeg får ingen fejl, men programmet fungerer ikke, som jeg forventer det. Hvad jeg ønsker er: Hvis filen allerede er i MasterFile.txt, har brugeren mulighed for enten at tage et andet sæt data ved at sige y eller Y, eller sig n eller N for at afslutte programmet. Problem: Scriptet afsluttes ikke . Hvis filen ikke findes i MasterFile.txt, skal du tage datasættet. Her er koden:

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 

Kommentarer

  • Um … hvilken skal er dette? sh -type skaller må ikke ' t bruge { ... } til blokke.
  • Jeg tror, det er bash. Programmet fungerede fint med kun en if-udsagn. Jeg tror ikke ' {...} er problemet. Der må være noget galt med den måde, jeg implementerede den indlejrede if
  • Nu får jeg en fejl, der siger, at der er noget galt med den sidste else udsagn
  • @Kusalananda, ja, du kan bruge dem til kommandogruppering der såvel som andre steder …
  • @Ptheguy if "${string3}" = 'Y' tager indholdet af string3 som navnet på en kommando og kører det med to argumenter = og Y

Svar

Et hurtigt svar skriv med mere konventionel syntaks:

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 

Du ser ikke ud til at have nogen funktioner deklareret her, så return er ikke gyldig for denne brugssag. Jeg formoder, at et ikke-bekræftende svar på dit spørgsmål, der er bedt om, er beregnet til at afbryde hele scriptet, derfor er brugen af exit.

Konstruktionen ${variable^} vil tvinge det første tegn i $variable, hvis et bogstav er, med store bogstaver, hvilket forenkler svarkontrollen.

Kommentarer

  • Så to ting: den ene, hvis jeg indtaster y stopper den, og uanset hvad jeg indtaster, får jeg efter fejl ./test/sh: line19: [[variable: command not found
  • Sørg for, at den første linje i scriptet er #!/bin/bash, og ikke #!/bin/sh. [[ [...] ]] konstruktioner er en bash ism.
  • ja, overskriften er korrekt
  • Og du har et mellemrum mellem [[ og "${string3^}"?
  • Det var det !! Tak endnu en gang. Hvis du har tid, har du noget imod at lære mig, hvad [[ betyder, og hvorfor et rum kan være så vigtigt?

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *