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