Declarații imbricate în scriptul Shell

Îmi cer scuze dacă problema mea a fost deja pusă în alte postări, dar nu am putut găsi niciuna. Scriu un mic script shell care îmi cere să scriu o declarație imbricată if. Nu sunt sigur că o fac corect. Nu primesc erori, dar programul nu funcționează așa cum mă aștept. Ce vreau este: dacă fișierul este deja în MasterFile.txt, atunci utilizatorul are opțiunea de a lua un alt set de date spunând y sau Y sau spuneți n sau N pentru a termina programul. Problemă: scriptul nu se termină . Dacă fișierul nu există în MasterFile.txt, atunci luați setul de date. Aici este codul:

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 

Comentarii

  • Um … ce shell este asta? sh -tipuri de tip shell nu ' nu utilizați { ... } pentru blocuri.
  • Cred că este bash. Programul a funcționat foarte bine cu o singură declarație if. Nu ' nu cred că {...} este problema. Trebuie să fie ceva în neregulă cu modul în care am implementat if cuibărit
  • Acum primesc o eroare care spune că este ceva în neregulă cu ultimul else declarație
  • @Kusalananda, ei bine, le-ați putea folosi pentru gruparea comenzilor acolo, precum și în altă parte …
  • @Ptheguy if "${string3}" = 'Y' ia conținutul string3 ca numele unei comenzi și îl rulează cu două argumente = și Y

Răspuns

O re scrieți cu o sintaxă mai convențională:

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 

Nu pare să aveți nicio funcție declarată aici, deci return nu este valabil pentru acest caz de utilizare. Am presupus că un răspuns non-afirmativ la întrebarea dvs. solicitată este menit să întrerupă întregul script, de unde utilizarea exit.

Construcția ${variable^} va forța primul caracter al $variable, dacă este o literă, să fie majusculă, ceea ce simplifică verificarea răspunsului.

Comentarii

  • Așadar, două lucruri: unul dacă introduc y se renunță și, indiferent de ce introduc, primesc următoarea eroare ./test/sh: line19: [[variable: command not found
  • asigurați-vă că prima linie a scriptului este #!/bin/bash și nu #!/bin/sh. Construcțiile [[ [...] ]] sunt un bash ism.
  • da, antetul este corect
  • Și aveți un spațiu între [[ și "${string3^}"?
  • Asta a fost !! Vă mulțumesc încă o dată. Dacă aveți timp, vă deranjează să mă învățați ce înseamnă [[ și de ce un spațiu poate fi atât de important?

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *