Î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
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
yse 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 unbashism. - 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?
sh-tipuri de tip shell nu ' nu utilizați{ ... }pentru blocuri.{...}este problema. Trebuie să fie ceva în neregulă cu modul în care am implementatifcuibăritelsedeclarațieif "${string3}" = 'Y'ia conținutulstring3ca numele unei comenzi și îl rulează cu două argumente=șiY…