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 genesteif - heb geïmplementeerd. Nu krijg ik een foutmelding die zegt dat er iets mis is met de laatste
elsestatement - @Kusalananda, je zou ze kunnen gebruiken voor het groeperen van commandos daar en elders …
- @Ptheguy
if "${string3}" = 'Y'neemt de inhoud vanstring3als de naam van een commando, en voert het uit met twee argumenten=enY…
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.
ytyp, wordt het afgesloten, en ongeacht wat ik typ, krijg ik de volgende fout./test/sh: line19: [[variable: command not found#!/bin/bashis, en niet#!/bin/sh.[[ [...] ]]constructies zijn eenbashisme.[[en"${string3^}"?[[betekent en waarom een spatie zo belangrijk kan zijn?