sæt -u-brug fungerer ikke som forventet

Jeg lærer, hvordan man effektivt bruger forskellige set muligheder i mit script og stødte på set -u, der ser ud til at være perfekt til at afslutte mit script, hvis en variabel ikke bliver indstillet korrekt (f.eks. sletning af brugere). I henhold til mand siden set -u og set -e gø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 oprettede et test script til at teste denne funktionalitet, men det ser ikke ud til at fungere som forventet . Måske kunne nogen bedre forklare mit problem for mig, og hvor jeg fortolker fejlagtigt? Test script er nedenfor. Tak.

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 scriptet viser 0 og “Dette fungerer” , og mislykkes derefter som ${testing2} ikke indstillet.

I stedet vises jeg 0 og “Dette fungerer” , følg med 0 og derefter 0 Dette skal ikke vises

Kan nogen give noget viden? Tak.

Kommentarer

  • Så opfølgning … er der nogen måde at gøre indstilling af en variabel til nullstrengen ulovlig / rejse en fejl? Jeg ' gætter ikke.

Svar

Fra ” man Bash “:

En parameter indstilles, hvis den er tildelt en værdi. Nullstrengen er en gyldig værdi. Når en variabel er indstillet, kan den muligvis kun frakobles ved hjælp af kommandoen unset builtin.

Når du gør testing2= du indstiller variablen til nulstrengen.

Skift den til unset testing2 og prøv igen.


set -e hjælper ikke i dette tilfælde, da en opgave aldrig har en udgangskode på 1. Prøv dette for at se, at den sidste udførte kommando (tildelingen) har en udgangskode på 0 eller læs dette spørgsmål :

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

Og jeg tror også, at brugen af set -e er mere et problem, som en løsning.

Hvad der kan få en fejl ved brugen af ikke-indstillede variabler er set -u:

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

Udgives:

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

Svar

testing2= indstiller testing2 variablen til en tom streng; variablen er faktisk indstillet .

Men hvis du skulle køre echo $testing99 i en interaktiv Bash-shell (uden at indstille errexit, dvs. set -e), får du en fejl:

bash: testing99: unbound variable 

Bortset fra

Mens jeg testede scripts lige nu, opdagede jeg, at en interaktiv shell ikke altid går ud når du forsøger at udvide en variabel, der ikke er indstillet mens en ikke-interaktiv skal (kører et shell-script) afslutter altid . Ifølge POSIX-mandsiden til set:

-u Skallen skal skrive en besked til standardfejl når den forsøger at udvide en variabel, der ikke er indstillet, og afslut med det samme. En interaktiv shell skal ikke afslutte.

En interaktiv Bash shell vil ikke afslutte, medmindre errexit har også blevet indstillet. På den anden side afsluttes en interaktiv dash-shell ikke – selvom set -e tidligere er kørt.

Kommentarer

  • Hvis bindestreg ikke afslutter med sæt -e; sæt-u; frakoblet aa; ekko $ aa, så dash er forkert.
  • @schily Da jeg først bemærkede dette, regnede jeg med, at dash-forfatterne vidste bedre end mig, og at der muligvis har været en vis tvetydighed i POSIX-specifikationerne, men at have gentaget markeret pubs.opengroup.org/onlinepubs/9699919799/utilities/… , jeg er enig i, at det ligner en fejl, okay.
  • Der er en simpel regel: Når både Korn Shell og Bourne Shell er enige, og en anden shellimplementering har en afvigelse, opfører den anden shell sig forkert.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *