Kapslade om uttalanden i Shell Script

Jag ber om ursäkt om mitt problem redan har ställts i andra inlägg, men jag kunde inte hitta några. Jag skriver ett litet skalskript som kräver att jag skriver ett kapslat if-uttalande. Jag är inte riktigt säker på att jag gör det rätt. Jag får inga fel, men programmet fungerar inte som jag förväntar mig. Vad jag vill ha är: Om filen redan finns i MasterFile.txt, har användaren möjlighet att antingen ta en annan uppsättning data genom att säga y eller Y, eller säg n eller N för att avsluta programmet. Problem: Skriptet avslutas inte . Om filen inte finns i MasterFile.txt, ta sedan datauppsättningen. Här är 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 … vilket skal är det här? sh -typskal använder inte ' { ... } för block.
  • Jag tror att den är bash. Programmet fungerade bra med bara ett if-uttalande. Jag tror inte ' t {...} är problemet. Det måste vara något fel med hur jag implementerade den kapslade if
  • Nu får jag ett fel som säger att det är något fel med den sista else uttalande
  • @Kusalananda, ja, du kan använda dem för kommandogruppering där såväl som på andra ställen …
  • @Ptheguy if "${string3}" = 'Y' tar innehållet i string3 som namnet på ett kommando och kör det med två argument = och Y

Svar

En snabb re skriv med mer konventionell 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 

Du verkar inte ha några funktioner deklarerade här, så return är inte giltigt för detta användningsfall. Jag har antagit att ett icke-bekräftande svar på din uppmanade fråga är tänkt att avbryta hela skriptet, därav användningen av exit.

Konstruktionen ${variable^} tvingar det första tecknet i $variable, om en bokstav, är versaler, vilket förenklar svarkontrollen.

Kommentarer

  • Så två saker: en om jag skriver in y det slutar, och oavsett vad jag skriver in får jag efter fel ./test/sh: line19: [[variable: command not found
  • se till att den första raden i skriptet är #!/bin/bash, och inte #!/bin/sh. [[ [...] ]] konstruktioner är en bash ism.
  • ja, rubriken är korrekt
  • Och har du ett mellanslag mellan [[ och "${string3^}"?
  • Det var det !! Tack än en gång. Om du har tid, har du något emot att lära mig vad [[ betyder och varför ett utrymme kan vara så viktigt?

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *