utilizarea set -u nu funcționează conform așteptărilor

Î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.

Lasă un răspuns

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