set -u-bruk fungerer ikke som forventet

Jeg lærer hvordan jeg effektivt kan bruke forskjellige set alternativer i skriptet mitt og kom over set -u som ser ut til å være perfekt for å avslutte skriptet mitt hvis en variabel ikke blir satt riktig (f.eks. sletting av brukere). I følge mann siden, set -u og set -e gjør følgende …

-e Exit immediately if a command exits with a non-zero status. -u Treat unset variables as an error when substituting. 

Jeg opprettet et testskript for å teste denne funksjonaliteten, men det ser ikke ut til å fungere som forventet . Kanskje noen bedre kan forklare problemet mitt for meg og hvor jeg tolker feil? Testskriptet er nedenfor. Takk.

set -e set -u testing="This works" echo $? echo ${testing} testing2= echo $? echo ${testing2} testing3="This should not appear" echo $? echo ${testing3} 

Jeg forventer at skriptet viser 0 og «Dette fungerer» , og mislykkes deretter som ${testing2} ikke satt.

I stedet vises jeg 0 og «Dette fungerer» , følg av 0 og deretter 0 Dette skal ikke vises

Kan noen gi litt kunnskap? Takk.

Kommentarer

  • Så oppfølging … er det noen måte å gjøre det å sette en variabel til nullstrengen ulovlig / heve en feil? Jeg ' gjetter ikke.

Svar

Fra » man Bash «:

En parameter angis hvis den har fått en verdi. Nullstrengen er en gyldig verdi. Når en variabel er angitt, kan den bare deaktiveres ved hjelp av den innstilte innebygde kommandoen.

Når du gjør testing2= du setter variabelen til nullstrengen.

Endre den til unset testing2 og prøv på nytt.


set -e hjelper ikke i dette tilfellet da en oppgave aldri har en utgangskode på 1. Prøv dette for å se at den siste kommandoen (oppgaven) har en utgangskode på 0, eller les dette spørsmålet :

$ false; a=""; echo $? 0 

Og jeg tror også at bruken av set -e er mer et problem som en løsning.

Det som kan få en feil ved bruk av usett variabler er set -u:

#!/bin/bash set -u testing="This works" echo ${testing} unset testing2 echo ${testing2} testing3="This should not appear" echo ${testing3} 

Kommer ut:

$ ./script.sh This works ./script.sh: line 9: testing2: unbound variable 

Svar

testing2= setter testing2 -variabelen til en tom streng; variabelen er faktisk satt .

Men hvis du skulle kjøre echo $testing99 i et interaktivt Bash-skall (uten å angi errexit, dvs. set -e), vil du få en feil:

bash: testing99: unbound variable 

Bortsett fra

Mens jeg testet skript akkurat nå, oppdaget jeg at et interaktivt skall ikke alltid går ut når du prøver å utvide en variabel som ikke er angitt mens et ikke-interaktivt skall (kjører et skallskript) går alltid ut . I følge POSIX-mansiden for set:

-u Skallet skal skrive en melding til standardfeil når den prøver å utvide en variabel som ikke er angitt og avslutte umiddelbart. Et interaktivt skall skal ikke gå ut.

Et interaktivt Bash-skall vil ikke gå ut med mindre errexit har også blitt satt. På den annen side vil ikke et interaktivt dashbord gå ut – selv om set -e tidligere har blitt kjørt.

Kommentarer

  • Hvis dash ikke avsluttes med set -e; sett -u; unset aa; ekko $ aa, da er dash feil.
  • @schily Da jeg først la merke til dette, skjønte jeg at dash-forfatterne visste bedre enn meg, og at det kan ha vært noen uklarheter i POSIX-spesifikasjonene, men å ha sjekket pubs.opengroup.org/onlinepubs/9699919799/utilities/… , jeg er enig i at det ser ut som en feil, ok.
  • Det er en enkel regel: når både Korn Shell og Bourne Shell er enige og en annen skallimplementering har et avvik, så oppfører det andre skallet seg feil.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *