Nestet Hvis uttalelser i Shell Script

Jeg beklager om problemet mitt allerede er blitt spurt i andre innlegg, men jeg kunne ikke finne noen. Jeg skriver et lite skallskript som krever at jeg skriver en nestet if-setning. Jeg er ikke helt sikker på at jeg gjør det riktig. Jeg får ingen feil, men programmet fungerer ikke slik jeg forventer det. Det jeg vil ha er: Hvis filen allerede er i MasterFile.txt, har brukeren muligheten til å enten ta et nytt datasett ved å si y eller Y, eller si n eller N for å avslutte programmet. Problem: Skriptet avsluttes ikke . Hvis filen ikke finnes i MasterFile.txt, tar du datasettet. 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 … hvilket skall er dette? sh -type skall ikke ' t bruk { ... } for blokker.
  • Jeg tror det er bash. Programmet fungerte fint med bare en hvis uttalelse. Jeg tror ikke ' t {...} er problemet. Det må være noe galt med måten jeg implementerte den nestede if
  • Nå får jeg en feil som sier at det er noe galt med den siste else uttalelse
  • @Kusalananda, vel, du kan bruke dem til kommandogruppering der så vel som andre steder …
  • @Ptheguy if "${string3}" = 'Y' tar innholdet av string3 som navnet på en kommando, og kjører det med to argumenter = og Y

Svar

Et raskt svar skriv med mer konvensjonell 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 ut til å ha noen funksjoner deklarert her, så return er ikke gyldig for denne brukssaken. Jeg antar at et ikke-bekreftende svar på det spurte spørsmålet ditt er ment å avbryte hele skriptet, derav bruk av exit.

Konstruksjonen ${variable^} vil tvinge det første tegnet i $variable, hvis en bokstav, er store bokstaver, noe som forenkler responskontrollen.

Kommentarer

  • Så to ting: en hvis jeg skriver inn y den avsluttes, og uansett hva jeg skriver inn, får jeg følgende feil ./test/sh: line19: [[variable: command not found
  • sørg for at første linje i skriptet er #!/bin/bash, og ikke #!/bin/sh. [[ [...] ]] konstruksjoner er en bash ism.
  • ja, overskriften er riktig
  • Og du har et mellomrom mellom [[ og "${string3^}"?
  • Det var det !! Takk igjen. Hvis du har tid, har du noe imot å lære meg hva [[ betyr og hvorfor et mellomrom kan være så viktig?

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *