Díval jsem se na několik skriptů, které napsali jiní lidé (konkrétně Red Hat), a mnoho jejich proměnných je přiřazeno pomocí následujícího zápisuVARIABLE1="${VARIABLE1:-some_val}"
nebo některé rozšířit další proměnnéVARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
Jaký má smysl používat tento zápis namísto pouhého přímého deklarování hodnot (např. VARIABLE1=some_val
)?
Existují výhody tohoto zápisu nebo možné chyby, kterým by se dalo předejít?
Má :-
mají v tomto kontextu konkrétní význam?
Přijatá odpověď:
Tato technika umožňuje proměnné přiřadit hodnotu, pokud je jiná proměnná prázdná nebo nedefinovaná. POZNÁMKA: Tato „jiná proměnná“ může být stejná nebo jiná proměnná.
úryvek
${parameter:-word}
If parameter is unset or null, the expansion of word is substituted.
Otherwise, the value of parameter is substituted.
POZNÁMKA: Tento formulář také funguje, ${parameter-word}
. Pokud byste chtěli vidět úplný seznam všech forem rozšíření parametrů dostupných v Bash, pak vřele doporučuji, abyste se podívali na toto téma na wiki Bash Hacker s názvem:„Rozšíření parametrů“.
Příklady
proměnná neexistuje
$ echo "$VAR1"
$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
default value
proměnná existuje
$ VAR1="has value"
$ echo "$VAR1"
has value
$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
has value
Totéž lze provést vyhodnocením jiných proměnných nebo spuštěním příkazů v části zápisu s výchozí hodnotou.
$ VAR2="has another value"
$ echo "$VAR2"
has another value
$ echo "$VAR1"
$
$ VAR1="${VAR1:-$VAR2}"
$ echo "$VAR1"
has another value
Další příklady
Můžete také použít mírně odlišný zápis, kde je to jen VARX=${VARX-<def. value>}
.
$ echo "${VAR1-0}"
has another value
$ echo "${VAR2-0}"
has another value
$ echo "${VAR3-0}"
0
Ve výše uvedeném $VAR1
&$VAR2
byly již definovány řetězcem „má jinou hodnotu“, ale $VAR3
nebyla definována, takže byla místo toho použita výchozí hodnota .
Další příklad
$ VARX="${VAR3-0}"
$ echo "$VARX"
0
Kontrola a přiřazení pomocí :=
notace
Nakonec zmíním praktický operátor :=
. To provede kontrolu a přiřadí hodnotu, pokud je testovaná proměnná prázdná nebo nedefinovaná.
Příklad
Všimněte si, že $VAR1
je nyní nastaveno. Operátor :=
provedl test a zadání v jediné operaci.
$ unset VAR1
$ echo "$VAR1"
$ echo "${VAR1:=default}"
default
$ echo "$VAR1"
default
Pokud je však hodnota nastavena dříve, zůstane sama.
$ VAR1="some value"
$ echo "${VAR1:=default}"
some value
$ echo "$VAR1"
some value
Příruční referenční tabulka Dandy
Související:Vytvořte příkaz vložením řetězce do tty?
Odkazy
- Rozšíření parametrů – Bash Hackers Wiki
- 10.2. Substituce parametrů
- Rozšíření parametrů Bash