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

Odkazy
- Rozšíření parametrů – Bash Hackers Wiki
- 10.2. Substituce parametrů
- Rozšíření parametrů Bash