A “ $ {a: -b} ” használata a szkriptek változó hozzárendeléséhez

Megnéztem néhány szkriptet, amelyet mások írtak (konkrétan a Red Hat), és sok változójuk a következő VARIABLE1="${VARIABLE1:-some_val}" jelöléssel vagy más kiterjesztéssel van hozzárendelve. változók VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"

Mi értelme ennek a jelölésnek a használata az értékek közvetlen deklarálása helyett (pl. VARIABLE1=some_val )?

Vannak előnyei ennek a jelölésnek vagy lehetséges hibák, amelyeket megakadályoznának?

Van-e konkrét jelentése a :- -nek ebben az összefüggésben? ?

Megjegyzések

  • Vessen egy pillantást a man bash; keresse meg a ” paraméterkiterjesztést ” (kb. 28%). Ezek a megbízások pl. alapértelmezett függvények: ” Csak akkor használja az alapértelmezett értéket, ha még nincs beállítva. ”
  • Mint :- beállítja az alapértelmezett értéket, a :+ értéket érték megváltoztatásához használják, ha a változó nem nulla. Például. v=option; cmd ${v:+ with $v} A ” cmd futtatása a ” opcióval történik. De ha $ v értéke null, akkor csak ” cmd “.

Válasz

Ez a technika lehetővé teszi egy változó értékének kijelölését, ha egy másik változó vagy üres, vagy nincs meghatározva. MEGJEGYZÉS: Ez az “egyéb változó” lehet ugyanaz vagy más változó.

kivonat

${parameter:-word} If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted. 

MEGJEGYZÉS: Ez az űrlap is működik, ${parameter-word}. Ha szeretné megtekinteni a Bash-ban elérhető összes paraméterbővítés teljes listáját, akkor azt javasoljuk, hogy vessen egy pillantást erre a témára a Bash Hacker wikiben: “ Paraméter kibővítése “.

Példák

változó nem létezik

$ echo "$VAR1" $ VAR1="${VAR1:-default value}" $ echo "$VAR1" default value 

változó létezik

$ VAR1="has value" $ echo "$VAR1" has value $ VAR1="${VAR1:-default value}" $ echo "$VAR1" has value 

Ugyanezt megtehetjük más változók kiértékelésével, vagy parancsok futtatásával a jelölés alapértelmezett értékrészén belül.

$ VAR2="has another value" $ echo "$VAR2" has another value $ echo "$VAR1" $ $ VAR1="${VAR1:-$VAR2}" $ echo "$VAR1" has another value 

További példák

Használhat egy kissé eltérő jelölést is, ahol csak VARX=${VARX-<def. value>}.

$ echo "${VAR1-0}" has another value $ echo "${VAR2-0}" has another value $ echo "${VAR3-0}" 0 

A fentiekben $VAR1 & $VAR2 már definiálva volt a “másik értéke” karakterlánccal, de $VAR3 nem volt meghatározva, ezért helyette az alapértelmezett értéket használták, div>.

Egy másik példa

$ VARX="${VAR3-0}" $ echo "$VARX" 0 

Ellenőrzés és hozzárendelés a := jelöléssel

Végül megemlítem a praktikus operátort, :=. Ez ellenőrzést végez és értéket rendel, ha a tesztelt változó üres vagy nem definiált.

Példa

Figyelje meg, hogy a $VAR1 most készlet. Az := operátor egyetlen művelettel végezte el a tesztet és a hozzárendelést.

$ unset VAR1 $ echo "$VAR1" $ echo "${VAR1:=default}" default $ echo "$VAR1" default 

Ha azonban az érték be van állítva előzetes, akkor egyedül marad.

$ VAR1="some value" $ echo "${VAR1:=default}" some value $ echo "$VAR1" some value 

Handy Dandy referencia táblázat

        ss tábla

hivatkozások

Megjegyzések

  • Ne feledje, hogy ezek nem mind a bővítések vannak dokumentálva a bash. A Q-ban található ${var:-word}, de nem a fenti ${var-word}. A POSIX A dokumentációnak azonban van egy szép táblázata, érdemes lehet átmásolni a th-be a válasz – pubs.opengroup.org/onlinepubs/9699919799/utilities/…
  • @Graeme, ez dokumentált, csak arra kell figyelni, hogy a a kettőspont elhagyása csak egy nem beállított paraméter tesztelését eredményezi.
  • A nagyszerű, ha valóban a echo fájlt akarja. De ha nem ‘ t, akkor próbálja ki a : beépített … : ${FOO:=default} A $FOO beállítása default, mint fent (azaz ha még nincs beállítva). De ‘ nincs visszhangja a $FOO folyamatnak.
  • Ok, választ találtam: stackoverflow.com / q / 24405606/1172302 . A ${4:-$VAR} használata működni fog.
  • +1 csak a részletes válaszért. De azért is, mert a kiváló bash wikire hivatkozol. És azért is, hogy példákat és táblázatot ad. A pokolba, csak + 1-ek egészen lefelé 🙂 Ami engem illet, majdnem megfelelő volt a szintaxis, de nem egészen – egyszerűen nem voltam ‘ eléggé törődve a man oldal keresésével de nem tudtam ‘ emlékezni arra, hogy melyik címsor alatt áll, és ‘ ma reggel 4 óta ébren vagyok :() ..

Válasz

@slm már tartalmazta a POSIX dokumentumokat – amelyek nagyon hasznosak -, de nem igazán bővítik ki, hogyan lehet ezeket a paramétereket kombinálni, hogy egymásra lehessen hatni. Itt még nem említik ezt a formát:

${var?if unset parent shell dies and this message is output to stderr} 

Ez egy kivonat újabb válaszomtól , és úgy gondolom, hogy ez nagyon jól mutatja, hogyan működnek ezek:

 sh <<-\CMD _input_fn() { set -- "$@" #redundant echo ${*?WHERES MY DATA?} #echo is not necessary though shift #sure hope we have more than $1 parameter : ${*?WHERES MY DATA?} #: do nothing, gracefully } _input_fn heres some stuff _input_fn one #here # shell dies - third try doesnt run _input_fn you there? # END CMD heres some stuff one sh: line :5 *: WHERES MY DATA? 

Egy másik példa ugyanazról :

 sh <<-\CMD N= #N is NULL _test=$N #_test is also NULL and v="something you would rather do without" ( #this subshell dies echo "v is ${v+set}: and its value is ${v:+not NULL}" echo "So this ${_test:-"\$_test:="} will equal ${_test:="$v"}" ${_test:+${N:?so you test for it with a little nesting}} echo "sure wish we could do some other things" ) ( #this subshell does some other things unset v #to ensure it is definitely unset echo "But here v is ${v-unset}: ${v:+you certainly wont see this}" echo "So this ${_test:-"\$_test:="} will equal NULL ${_test:="$v"}" ${_test:+${N:?is never substituted}} echo "so now we can do some other things" ) #and even though we set _test and unset v in the subshell echo "_test is still ${_test:-"NULL"} and ${v:+"v is still $v"}" # END CMD v is set: and its value is not NULL So this $_test:= will equal something you would rather do without sh: line 7: N: so you test for it with a little nesting But here v is unset: So this $_test:= will equal NULL so now we can do some other things _test is still NULL and v is still something you would rather do without 

A fenti példa a POSIX paraméterek mind a 4 formájának előnyeit kihasználja és különféle :colon null vagy not null tesztjeik. További információ található a fenti linken, és itt van újra .

Egy másik dolog, amelyet az emberek gyakran nem vesznek figyelembe a ${parameter:+expansion} kapcsán, az, hogy ez mennyire hasznos lehet egy itt-dokumentumban. Itt van egy másik részlet a eltérő válasz :

TOP

Itt beállíthat néhány alapértelmezett értéket, és előkészíti a nyomtatásra, amikor hívják …

#!/bin/sh _top_of_script_pr() ( IFS="$nl" ; set -f #only split at newlines and don"t expand paths printf %s\\n ${strings} ) 3<<-TEMPLATES ${nl= } ${PLACE:="your mother"s house"} ${EVENT:="the unspeakable."} ${ACTION:="heroin"} ${RESULT:="succeed."} ${strings:=" I went to ${PLACE} and saw ${EVENT} If you do ${ACTION} you will ${RESULT} "} #END TEMPLATES 

KÖZEPES

Itt határozhat meg más funkciókat, amelyek az eredmények alapján meghívják a nyomtatási funkciót …

 EVENT="Disney on Ice." _more_important_function() { #...some logic... [ $((1+one)) -ne 2 ] && ACTION="remedial mathematics" _top_of_script_pr } _less_important_function() { #...more logic... one=2 : "${ACTION:="calligraphy"}" _top_of_script_pr } 

BOTTOM

Most már mindent beállítottál, így itt fogod végrehajtani és meghúzni az eredményeket.

 _less_important_function : "${PLACE:="the cemetery"}" _more_important_function : "${RESULT:="regret it."}" _less_important_function 

EREDMÉNYEK

Egy pillanat alatt belemerülök, hogy miért, de a fentiek futtatása a következő eredményeket hozza:

_less_important_function()"s első futtatás:

Anyád házához mentem, és megláttam a Disney on Ice jég et.

Ha kalligráfia t csinálsz, akkor sikerülni fog.

th hu _more_important_function():

A temetőbe mentem és meglátta a Disney-t a jégen.

Ha javító matematikát folytat , akkor sikerrel jár.

_less_important_function() ismét:

A temetőbe mentem, és megláttam a Disney-t a jégen.

Ha javító matematikát folytat, megbánja.

HOGYAN MŰKÖDIK:

A legfontosabb jellemző itt a conditional ${parameter} expansion. koncepció. Változót beállíthat egy érték csak akkor, ha nincs beállítva vagy null az űrlap használatával:

${var_name : = desired_value}

Ha ehelyett csak egy nem beállított változót szeretne beállítani, akkor a és a null értékek a jelenlegi állapotban maradnak.

HATÁLYBAN:

Észreveheti, hogy a fenti példában $PLACE és $RESULT megváltozik, ha a parameter expansion annak ellenére, hogy a _top_of_script_pr() t már hívták, feltehetőleg beállítva őket, amikor fut. Ennek oka az, hogy a _top_of_script_pr() egy ( subshelled ) függvény – csatoltam inkább a parens ben, mint a többieknél használt { curly braces } ben. Mivel alhéjban hívják meg, minden beállított változó locally scoped és a szülőhéjába visszatérve ezek az értékek eltűnnek.

De amikor _more_important_function() beállít $ACTION , akkor globally scoped tehát befolyásolja a _less_important_function()"s $ACTION mert _less_important_function() $ACTION csak ${parameter:=expansion}.

Megjegyzések

  • Jó látni, hogy a gyorsírás alapértelmezett értéke működik a Bourne Shellben

Válasz

Személyes tapasztalat.

Ezt a formátumot olykor a szkriptjeimben használom, hogy ad hoc értékeket túllépjek, példáulha van:

$ cat script.sh SOMETHING="${SOMETHING:-something}"; echo "$SOMETHING"; 

Futtathatok:

$ env SOMETHING="something other than the default value" ./script.sh` 

anélkül, hogy változtatnom kellene a (z) SOMETHING eredeti alapértelmezett értéke.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük