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
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 unbash
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?
sh
-tipo shell non ' t utilizzare{ ... }
per i blocchi.{...}
. Deve esserci qualcosa di sbagliato nel modo in cui ho implementatoif
else
statementif "${string3}" = 'Y'
prende il contenuto distring3
come nome di un comando e lo esegue con due argomenti=
eY
…