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
else
statement - @Kusalananda, je zou ze kunnen gebruiken voor het groeperen van commandos daar en elders …
- @Ptheguy
if "${string3}" = 'Y'
neemt de inhoud vanstring3
als 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.
y
typ, wordt het afgesloten, en ongeacht wat ik typ, krijg ik de volgende fout./test/sh: line19: [[variable: command not found
#!/bin/bash
is, en niet#!/bin/sh
.[[ [...] ]]
constructies zijn eenbash
isme.[[
en"${string3^}"
?[[
betekent en waarom een spatie zo belangrijk kan zijn?