Dichiarazioni If annidate nello script shell

Mi scuso se il mio problema è già stato chiesto in altri post, ma non sono riuscito a trovarne alcuno. Sto scrivendo un piccolo script di shell che mi richiede di scrivere unistruzione if annidata. Non sono veramente sicuro di farlo bene. Non ricevo errori, ma il programma non funziona come mi aspetto. Quello che voglio è: se il file è già in MasterFile.txt, lutente ha la possibilità di prendere un altro set di dati dicendo y o Y oppure dì n o N per terminare il programma. Problema: lo script non si interrompe . Se il file non esiste in MasterFile.txt, prendi il set di dati. Ecco il codice:

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 

Commenti

  • Um … che shell è questa? sh -tipo shell non ' t utilizzare { ... } per i blocchi.
  • Credo che sia bash. Il programma ha funzionato bene con una sola istruzione if. Non ' penso che il problema sia {...}. Deve esserci qualcosa di sbagliato nel modo in cui ho implementato if
  • nidificato Ora ottengo un errore che dice che cè qualcosa di sbagliato nellultimo else statement
  • @Kusalananda, beh, potresti usarli per raggruppare i comandi lì e altrove …
  • @Ptheguy if "${string3}" = 'Y' prende il contenuto di string3 come nome di un comando e lo esegue con due argomenti = e Y

Risposta

Un rapido esame scrivi con una sintassi più convenzionale:

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 

Non sembra che tu abbia alcuna funzione dichiarata qui, quindi return non è valido per questo caso duso. Ho presunto che una risposta non affermativa alla tua domanda suggerita abbia lo scopo di interrompere lintero script, da qui luso di exit.

Il costrutto ${variable^} forza il primo carattere di $variable, se una lettera, a essere maiuscolo, il che semplifica il controllo della risposta.

Commenti

  • Quindi due cose: una se inserisco y si chiude e, indipendentemente da ciò che inserisco, ottengo il seguente errore ./test/sh: line19: [[variable: command not found
  • assicurarsi che la prima riga dello script sia #!/bin/bash e non #!/bin/sh. I costrutti [[ [...] ]] sono un bash ism.
  • sì, lintestazione è corretta
  • E hai uno spazio tra [[ e "${string3^}"?
  • Era così !! Grazie ancora una volta. Se hai tempo, ti dispiace insegnarmi cosa significa [[ e perché uno spazio può essere così importante?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *