Învăț cum să folosesc în mod eficient diferite opțiuni set
în scriptul meu și am întâlnit set -u
care pare a fi perfect pentru a ieși din scriptul meu dacă o variabilă nu este setată corect (de exemplu, ștergerea utilizatorilor). Conform paginii man , set -u
și set -e
face următoarele …
-e Exit immediately if a command exits with a non-zero status. -u Treat unset variables as an error when substituting.
Am creat un script de testare pentru a testa această funcționalitate, dar nu pare să funcționeze conform așteptărilor . Poate cineva mi-ar putea explica mai bine problema mea și unde interpretez greșit? Scriptul de testare este mai jos. Mulțumesc.
set -e set -u testing="This works" echo $? echo ${testing} testing2= echo $? echo ${testing2} testing3="This should not appear" echo $? echo ${testing3}
Mă aștept ca scriptul să afișeze 0 și „Acest lucru funcționează” și apoi eșuează așa cum este ${testing2}
nu este setat.
În schimb, sunt afișat 0 și „Acest lucru funcționează” , urmează de 0 și apoi 0 Aceasta nu ar trebui să apară
Poate cineva să ofere unele cunoștințe? Mulțumesc.
Comentarii
- Deci, urmărire … există vreo modalitate de a face ca setarea unei variabile la șirul nul să fie ilegală / să ridice o eroare? ' presupun că nu.
Răspuns
De la ” man Bash „:
Un parametru este setat dacă i sa atribuit o valoare. Șirul nul este o valoare validă. Odată setată o variabilă, aceasta poate fi anulată numai utilizând comanda unset builtin.
Când faceți testing2=
setați variabila la șirul nul.
Schimbați-l în unset testing2
și încercați din nou.
div id = „1fdc438019″>
nu ajută în acest caz, deoarece o atribuire nu are niciodată un cod de ieșire de 1. Încercați acest lucru pentru a vedea că ultima comandă executată (atribuirea) are un cod de ieșire de 0 sau citiți această întrebare :
$ false; a=""; echo $? 0
Și, de asemenea, cred că utilizarea setului -e este mai mult o problemă decât o soluție.
Ceea ce poate obține o eroare la utilizarea variabilelor nesetate este set -u
:
#!/bin/bash set -u testing="This works" echo ${testing} unset testing2 echo ${testing2} testing3="This should not appear" echo ${testing3}
Va afișa:
$ ./script.sh This works ./script.sh: line 9: testing2: unbound variable
Răspuns
testing2=
setează variabila testing2
la un șir gol; variabila de fapt este setată .
Cu toate acestea, dacă ar fi să rulați echo $testing99
într-un shell Bash interactiv (fără a seta errexit
, adică set -e
), veți primi o eroare:
bash: testing99: unbound variable
În afară de
În timp ce testam scripturile chiar acum, am descoperit că un shell interactiv nu iese întotdeauna atunci când încercați să extindeți o variabilă care nu a fost setată în timp ce un shell non-interactiv (rulează un script shell) iese întotdeauna . Conform paginii de manual POSIX pentru set
:
-u Shell-ul va scrie un mesaj la eroarea standard când încearcă să extindă o variabilă care nu este setată și să părăsească imediat. Un shell interactiv nu va ieși.
Un shell interactiv Bash nu va ieși decât dacă errexit
are de asemenea a fost setat. Pe de altă parte, un shell de liniuță interactiv nu va ieși – chiar dacă set -e
a fost rulat anterior.
Comentarii
- Dacă liniuța nu iese cu set -e; set -u; dezactivat aa; echo $ aa, atunci liniuța este greșită.
- @schily Când am observat asta pentru prima dată, m-am gândit că autorii liniei știau mai bine decât mine și că este posibil să fi existat o oarecare ambiguitate în specificațiile POSIX, dar care au re- bifat pubs.opengroup.org/onlinepubs/9699919799/utilities/… , sunt de acord că arată ca o eroare, bine.
- Există o regulă simplă: atunci când atât Korn Shell cât și Bourne Shell sunt de acord și o altă implementare a shell-ului are o abatere, atunci cealaltă shell se comportă incorect.