Geneste If-verklaringen in Shell-script

Mijn excuses als mijn probleem al in andere berichten is gesteld, maar ik kon er geen vinden. Ik ben aan het schrijven een klein shellscript waarvoor ik een geneste if-instructie moet schrijven. Ik weet niet zeker of ik het goed doe. Ik krijg geen foutmeldingen, maar het programma werkt niet zoals ik verwacht. Wat ik wil is: als het bestand zich al in MasterFile.txt bevindt, heeft de gebruiker de mogelijkheid om een andere set gegevens te nemen door y of Y, of zeg n of N om het programma te beëindigen. Probleem: script wordt niet beëindigd . Als het bestand niet bestaat in MasterFile.txt, neem dan de dataset. Hier “is de 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 

Reacties

  • Um … welke shell is dit? sh -type shells gebruiken ' t { ... } voor blokken.
  • Ik geloof dat het bash is. Het programma werkte prima met slechts één if-statement. Ik denk niet dat {...} het probleem is. Er moet iets mis zijn met de manier waarop ik de geneste if
  • heb geïmplementeerd. Nu krijg ik een foutmelding die zegt dat er iets mis is met de laatste else statement
  • @Kusalananda, je zou ze kunnen gebruiken voor het groeperen van commandos daar en elders …
  • @Ptheguy if "${string3}" = 'Y' neemt de inhoud van string3 als de naam van een commando, en voert het uit met twee argumenten = en Y

Antwoord

Snel opnieuw schrijf met meer conventionele syntaxis:

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 

Het lijkt erop dat hier geen functies zijn gedeclareerd, dus return is niet geldig voor deze use-case. Ik neem aan dat een niet-bevestigend antwoord op de door jou gestelde vraag bedoeld is om het hele script af te breken, vandaar het gebruik van exit.

De constructie ${variable^} dwingt het eerste teken van $variable, als het een letter is, tot hoofdletters, wat de responscontrole vereenvoudigt.

Opmerkingen

  • Dus twee dingen: een als ik y typ, wordt het afgesloten, en ongeacht wat ik typ, krijg ik de volgende fout ./test/sh: line19: [[variable: command not found
  • zorg ervoor dat de eerste regel van het script #!/bin/bash is, en niet #!/bin/sh. [[ [...] ]] constructies zijn een bash isme.
  • ja, de koptekst is correct
  • En je hebt een spatie tussen [[ en "${string3^}"?
  • Dat was het !! Nogmaals bedankt. Als je de tijd hebt, kun je me dan leren wat [[ betekent en waarom een spatie zo belangrijk kan zijn?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *