Linux: Kniha kouzel, 2.15 (1. března 2025)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

19. Proměnné prostředí a interpretu

Vývoj vanilkové příchuti Linuxu: Knihy kouzel byl 1. března 2025 ukončen. Tento text je zachován jako historický, ale chyby již nejsou opravovány. Odnože projektu pod kompatibilní licencí jsou vítány.

1. Úvod

Tato kapitola pokrývá veškerou práci s proměnnými a funkcemi interpretu Bash a uvádí některé systémově důležité proměnné prostředí. Rovněž pokrývá práci s parametry skriptů a funkcí v Bashi.

Proměnné se v bashi (zejména ve skriptech a funkcích) používají k dočasnému uchování krátkých textových dat (popř. čísel) mezi příkazy. Většina proměnných je viditelná pouze v rámci dané instance interpretu; pro práci s prostředím se používají „exportované“ proměnné, které instance bashe vytvoří z proměnných prostředí v momentě svého spuštění a ze kterých sestaví prostředí každého procesu, který spustí.

GNU Bash je vyvíjen v rámci projektu GNU.

2. Definice

  • Bash rozeznává tři základní typy proměnných: řetězcové proměnné, pole (indexované celými čísly od nuly) a asociativní pole (indexované neprázdným řetězcem zvaným klíč).
  • Prostředí je soubor řetězcových proměnných (tzv. proměnných prostředí), který má nejen bash, ale každý proces (s výjimkou jaderných démonů). Prostředí se kopíruje do každého nově spuštěného procesu a bash ho reprezentuje souborem exportovaných proměnných, což umožňuje prostředí nově vytvořených procesů měnit.
  • Funkce je krátký skript, který se místo do souboru ukládá do paměti (stejně jako proměnná). Na rozdíl od skutečného skriptu se vždy spouští v rámci stávající instance bashe. Stejně jako skript lze funkci zavolat zadáním jejího názvu jako příkazu a má svoje poziční parametry. Funkce se často používají ve skriptech jako podprogramy, ale užitečné jsou i v interaktivním režimu.
  • Konstanta je proměnná (jen zřídka exportovaná), které je jednorázově přidělena hodnota a dále již nemůže být změněna ani zrušena.
  • Parametry (také poziční parametry) jsou v bashi přístupné jako zvláštní proměnné „1“, „2“ atd. Poziční parametry lze číst všemi způsoby, jakými lze číst obyčejné proměnné, ale přiřadit lze jen do všech najednou, a to voláním skriptu, volání funkce nebo příkazem „set“.
  • Celočíselné proměnné jsou řetězcové proměnné a prvky polí či asociativních polí, kterým byl nastaven atribut „i“. Při každém přiřazení do takové proměnné (resp. prvku) se přiřazovaný text vyhodnotí jako celočíselný výraz a do proměnné/prvku se přiřadí výsledná celočíselná hodnota.

Názvy proměnných a funkcí jsou obvykle tvořeny jen velkými a malými písmeny anglické abecedy, podtržítky a číslicemi, přičemž nesmí začínat číslicí.

3. Zaklínadla: Proměnné v bashi

3/1 Řetězcové proměnné

@přiřadit proměnné hodnotu#1
název_proměnné="nová-hodnota"
@zrušit proměnnou#2 (1)
unset -v název_proměnné
@vypsat seznam (s hodnotami/bez hodnot/s hodnotami ve formátu txtz)#3
for _ in $(compgen -v); do [[ ${!_@a} = *[aA]* ]] || declare -p "$_"; done
for _ in $(compgen -v); do [[ ${!_@a} = *[aA]* ]] || printf '%s\n' "$_"; done
for _ in $(compgen -v); do [[ ${!_@a} = *[aA]* ]] || printf '%s=%s\0' "$_" "${!_}"; done
@připojit text na začátek/konec proměnné#4
název_proměnné="nová-hodnota$název_proměnné"
název_proměnné+="nová-hodnota"
@jde o řetězcovou proměnnou? (alternativy)#5
[[ -v název_proměnné && ${název_proměnné@a} = *([!aA]) ]]
[[ -v název_proměnné && ${název_proměnné@a} =~ ^[^aA]*$ ]]
@automatická konverze velikosti písmen při přiřazení (na velká písmena/na malá písmena/vypnout)#6 (2)
declare -u název_proměnné
declare -l název_proměnné
declare +lu název_proměnné

3/2 Exportování proměnných

@exportovat/neexportovat proměnnou#1
export název_proměnné[=nová-hodnota]
export -n název_proměnné
@jde o exportovanou/neexportovanou proměnnou?#2
[[ ${název_proměnné@a} = *x* ]]
[[ -v název_proměnné && ! ${název_proměnné@a} = *x* ]]
@seznam exportovaných proměnných (s hodnotami/bez hodnot)#3
(set -o posix; declare -x)
compgen -e
@seznam neexportovaných proměnných (s hodnotami/bez hodnot)#4
(set -o posix; declare +x)
for _ in $(compgen -v); do [[ ${!_@a} = *x* ]] || printf '%s\n' "$_"; done

3/3 Obecné

@jde o proměnnou?#1
test -v název_proměnné
@seznam všech proměnných (s hodnotami/bez hodnot)#2
(set -o posix; set)
compgen -v
@dosadit názvy všech proměnných, které začínají určitou předponou#3 (3)
${!předpona@}⊨ PATH PIPESTATUS PPID PROMPT_COMMAND PS1 PS2 PS4 PWD

3/4 Pole (jako celek)

@vytvořit či přepsat/zrušit/vyprázdnit#1 (4)
název_pole=([prvky])
unset -v název_pole
název_pole=()
@seznam polí (bez hodnot)#2
compgen -A arrayvar
@dosadit počet prvků#3
${#názevpole[@]}
@jde o pole?#4
[[ ${název_proměnné@a} = *a* ]]
@zkopírovat (celé pole/výřez)#5
cílové_pole=("${zdrojové_pole[@]}")
cílové_pole=("${zdrojové_pole[@]:první-kopírovaný-index[:maximální-počet]}")
@spojit dvě pole#6
cílové_pole=("${první_pole[@]}" "${druhé_pole[@]}")
@rozdělit pole na poloviny#7
první_cíl=("${názevpole[@]:0:$((${#název_pole[@]}/2+1))}")
druhý_cíl=("${názevpole[@]:$((${#název_pole[@]}/2+1))}")
@obrátit pořadí prvků pole#8 (5)
i=-1 j=${#název_pole[@]}
while test $((++i)) -lt $((--j))
do
x=${název_pole[i]}
název_pole[i]=${název_pole[j]}
název_pole[j]=$x
done
[unset -v i j x]
@přiřadit do pole parametry skriptu či funkce#9
cílové_pole=("$@")

3/5 Pole (práce s prvky)

@přečíst prvek na indexu N/přiřadit do něj#1 (6)
${název_pole[N][-náhradní hodnota]}
název_pole[N]=hodnota
@iterovat přes prvky/přes indexy#2
for iterační_proměnná in "${název_pole[@]}"; do ...; done
for iterační_proměnná in "${!název_pole[@]}"; do ...; done
@dosadit výřez pole#3 (7)
"${zdrojové_pole[@]:první-kopírovaný-index[:maximální-počet]}"
@vložit nový prvek na začátek/konec#4 (8)
název_pole=("nový prvek" "${název_pole[@]}")
název_pole+=("nový prvek")
@odstranit N prvků na začátku/konci#5
název_pole=("${názevpole[@]:N}")
název_pole=("${názevpole[@]:0:$((${#název_pole[@]}-N))}")

3/6 Asociativní pole (jako celek)

@vytvořit = vyprázdnit#1
unset -v název && declare -A název
@zrušit#2
unset -v název
@jde o asociativní pole?#3
[[ ${název_proměnné@a} = *A* ]]
@seznam asociativních polí (bez hodnot)#4
for _ in $(compgen -v); do [[ ! ${!_@a} = *A* ]] || printf '%s\n' "$_"; done
@dosadit počet prvků#5
${#název[@]}
@zkopírovat#6
unset -v cílovépole
declare -A cílovépole
for _ in "${!zdrojovépole[@]}"; do cílovépole[$_]=${zdrojovépole[$_]}; done
@sloučit dvě asociativní pole#7
for _ in "${!zdrojovépole[@]}"; do cílovépole[$_]=${zdrojovépole[$_]}; done

3/7 Asociativní pole (práce s klíči a prvky)

Pozor! Klíčem v asociativním poli může být pouze neprázdný řetězec! Prázdný klíč způsobí chybu „chybný podskript pole“.

@přečíst hodnotu prvku (klíč je řetězec/hodnota proměnné)#1 (9)
["...]${názevpole["klíč"]}[..."]
["...]${názevpole["$klíč_proměnná"]}[..."]
@přiřadit hodnotu prvku (klíč je: řetězec/hodnota proměnné)#2 (10)
názevpole["klíč"]="hodnota"
názevpole[$klíč_proměnná]="hodnota"
@obsahuje prvek se zadaným klíčem? (klíč je hodnota proměnné)#3
test -v "názevpole[${proměnná_s_klíčem@Q}]"
@obsahuje prvek se zadaným klíčem? (klíč je řetězec)#4
: 'klíč' [&&]
test -v "názevpole[${_@Q}]"
@dosadit klíče/hodnoty#5
"${!název_pole[@]}"
"${název_pole[@]}"
@iterovat přes klíče/přes hodnoty#6
for iterační_proměnná in "${!název_pole[@]}"; do ...; done
for iterační_proměnná in "${název_pole[@]}"; do ...; done
@odstranit prvek podle klíče (klíč je hodnota proměnné)#7
unset -v "názevpole[${proměnná_s_klíčem@Q}]"
@odstranit prvek podle klíče (klíč je řetězec)#8
: "klíč" [&&]
unset -v "názevpole[${_@Q}]"
@příklady: přiřadit do proměnné „x“ hodnotu z asociativního pole „a“, kde klíčem je: zpětné lomítko/dvě zpětná lomítka/apostrof/dvojitá uvozovka/„A B“/„} }“#9
x="${a["\\"]}"
x="${a["\\\\"]}"
x="${a["'"]}"
x="${a["\""]}"
x="${a["A B"]}"
x="${a["} }"]}"

3/8 Funkce

@vytvořit/přepsat funkci#1 (11)
function název_funkce {
[tělo-funkce]
}
@zavolat funkci#2
název_funkce [parametry]
@seznam funkcí (s těly/bez těl)#3
declare -f
compgen -A function
@existuje funkce?#4
declare -f název_funkce >/dev/null
@zrušit funkci#5
unset -f název_funkce
@vypsat definici funkce#6
declare -f název_funkce
@exportovat/neexportovat funkci#7 (12)
export -f název_funkce
export -fn název_funkce

3/9 Celočíselné proměnné

@jde o celočíselnou proměnnou?#1 (13)
[[ ${název_proměnné@a} = *i* ]]
@nastavit řetězcovou proměnnou jako celočíselnou (obecně/příklady...)#2 (14)
declare -i název_proměnné=$název_proměnné [další_proměnná=$další_proměnná]
declare -i x=$x
declare -i x=-1
@nastavit pole či asociativní pole, že jeho prvky budou celočíselné#3 (15)
declare -i název_pole_či_asoc_pole
@přičíst/odečíst od celočíselné proměnné#4
: $((název_proměnné += číslo))
: $((název_proměnné -= číslo))

3/10 Jmenné odkazy

@vytvořit jmenný odkaz#1 (16)
declare -n název_odkazu=název_odkazované_proměnné
@zrušit jmenný odkaz#2
unset -n název_odkazu
@je proměnná jmenný odkaz?#3
test -R název_proměnné
@přečíst jmenný odkaz místo odkazované proměnné (alternativy)#4
if test -R název_odkazu; then declare +n název_odkazu; echo $název_odkazu; declare -n název_odkazu; else false; fi
test -R název_odkazu && eval "$(declare -p název_odkazu | sed -E '1s/^[^=]*=/echo /')"

3/11 Konstanty

@seznam konstant (pro člověka/bez hodnot)#1
readonly
for _ in $(compgen -v); do [[ ! ${!_@a} = *r* ]] || printf '%s\n' "$_"; done
@jde o konstantu?#2
[[ ${název_proměnné@a} = *r* ]]
@vytvořit konstantu#3 (17)
readonly název_konstanty="hodnota" [další_název_konstanty="hodnota"]

4. Zaklínadla: Dosazování proměnných

4/1 Jednoduché a nepřímé dosazení

@dosadit hodnotu řetězcové proměnné (alternativy)#1
$název_proměnné⊨ Hello, world!
${název_proměnné}
@dosadit hodnotu řetězcové proměnné s odzvláštněním#2 (18)
${název_proměnné@Q}⊨ 'Hello, world!'
@nepřímé dosazení#3 (19)
${!proměnná[zbytek výrazu]}
@dosadit prvky pole (všechny prvky/jeden prvek/výřez/poslední prvek)#4
"${název_pole[@]}"
"${název_pole[index]}"
"${název_pole[@]:první-kopírovaný-index[:maximální-počet]}"
"${název_pole[-1]}"
@dosadit hodnotu z asociativního pole (klíč je řetězec/hodnota proměnné)#5 (20)
${název_asoc_pole["klíč"]}
${název_asoc_pole["$klíč_proměnná"]}
@dosadit všechny klíče/všechny hodnoty z asociativního pole#6
"${!název_asoc_pole[@]}"
"${název_asoc_pole[@]}"

4/2 Vlastnosti proměnné

@dosadit délku hodnoty proměnné ve znacích#1
${#název_proměnné}⊨ 0
@dosadit znaky reprezentující zapnuté atributy dané proměnné#2 (21)
${název_proměnné@a}⊨ x
@dosadit příkaz bashe, který vytvoří danou proměnnou včetně atributů a hodnoty#3
${název_proměnné@A}⊨ declare -x HOME='/home/kalandira'

4/3 Podmíněné dosazení

@je-li proměnná definovaná/neprázdná, dosadit; jinak použít náhradní řetězec#1 (22)
${název_proměnné-["]náhradní řetězec["]}
${název_proměnné:-["]náhradní řetězec["]}
@dosadit hodnotu proměnné, která musí být definovaná/neprázdná; jinak zobrazit chybové hlášení a ukončit skript#2
${název_proměnné?["]chybové hlášení]["]}
${název_proměnné:?["]chybové hlášení]["]}
@je-li proměnná definovaná/neprázdná, dosadit; jinak jí přiřadit náhradní hodnotu a dosadit#3
${název_proměnné=["]náhradní řetězec["]}
${název_proměnné:=["]náhradní řetězec["]}
@dosadit řetězec, jen pokud je proměnná definovaná/neprázdná#4 (23)
${název_proměnné+["]řetězec["]}
${název_proměnné:+["]řetězec["]}

4/4 Dosazení podřetězce či se substitucí

@dosadit podřetězec hodnoty proměnné#1 (24)
${název_proměnné: index-prvního-znaku-od-0 : maximální-délka }
@dosadit hodnotu proměnné po odebrání nejkratší/nejdelší shody začátku hodnoty se vzorkem#2
${název_proměnné#vzorek}
${název_proměnné##vzorek}
@dosadit hodnotu proměnné po odebrání nejkratší/nejdelší shody konce hodnoty se vzorkem#3
${název_proměnné%vzorek}
${název_proměnné%%vzorek}
@dosadit hodnotu proměnné po nahrazení první/všech shod se vzorkem řetězcem náhrady#4
${název_proměnné/vzorek[/řetězec náhrady]}
${název_proměnné//vzorek[/řetězec náhrady]}
@dosadit hodnotu proměnné velkými/malými písmeny#5
${název_proměnné^^}
${název_proměnné,,}
@interpretovat hodnotu jako by byla uvedena v konstrukci $'text' a výsledek dosadit#6
${název_proměnné@E}

4/5 Poziční parametry

@dosadit N-tý poziční parametr (alternativy)#1 (25)
$N
${N}
@dosadit všechny parametry od $1: do samostatných parametrů/jen oddělené mezerou#2 (26)
"$@"
"$*"
@dosadit počet pozičních parametrů#3
$#⊨ 0
@smazat N pozičních parametrů počínaje od $1, zbytek přečíslovat#4 (27)
shift [N]
@nastavit poziční parametry#5 (28)
set -- parametr
@dosadit úsek parametrů (samostatně/oddělené mezerou)#6
"${@: číslo-prvního-parametru [: maximální-počet] }"
"${*: číslo-prvního-parametru [: maximální-počet] }"
@dosadit všechny parametry počínaje $0 (samostatně/oddělené mezerou)#7
"${@:0}"
"${*:0}"

4/6 Aritmetické operace při dosazení

@inkrementovat/dekrementovat a dosadit#1
$((++název_proměnné))
$((--název_proměnné))
@přičíst/odečíst číslo, přiřadit a dosadit#2
$((název_proměnné += číslo))
$((název_proměnné -= číslo))
@přičíst/odečíst číslo a dosadit (bez přiřazení)#3
$((název_proměnné + číslo))
$((název_proměnné - číslo))

4/7 Různé příklady

@dosadit první neprázdnou z proměnných „a“, „b“ a „c“#1
${a:-${b:-${c:-}}}
@dosadit proměnnou „abc“ s odstraněním všech konců řádků#2
${abc//$'\n'}
@dosadit proměnnou „abc“ s tím, že všechny číslice se nahradí nulami#3
${abc//[0123456789]/0}
@z proměnné „abc“ dosadit jen číslice#4
${abc//[!0123456789]}

5. Zaklínadla: Proměnné prostředí

5/1 Spouštění programů s upraveným prostředím

@spustit s upraveným prostředím (jednodušší varianta)#1
[[/usr/bin/]env] PROMĚNNÁ=hodnota [DALŠÍ_PROMĚNNÁ=další-hodnota] příkaz [parametr]
@spustit v jiném aktuálním adresáři#2
env -C cesta příkaz [parametr]
@spustit s upraveným prostředím (komplexní varianta)#3 (29)
[[/usr/bin/]env [-i] [--unset=PROMĚNNÁ] [-C nový/aktuální/adresář]] [PROMĚNNÁ=hodnota] příkaz [parametr]

5/2 Předdefinované proměnné

@absolutní cesta domovského adresáře#1
$HOME⊨ /home/petr
@vyhledávací cesty externích příkazů#2 (30)
$PATH⊨ /home/petr/bin:/usr/local/sbin:/usr/local/bin:
/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
@označení příslušného grafického zobrazovacího rozhraní#3
$DISPLAY⊨ :0.0
@typ terminálu#4 (31)
$TERM⊨ xterm-256color
@typ sezení#5 (32)
$XDG_SESSION_TYPE⊨ x11
@jazyk/lokalizace systému#6
$LANGUAGE⊨ cs_CZ
$LANG⊨ cs_CZ.UTF-8
@výchozí interpret příkazové řádky#7
$SHELL⊨ /bin/bash
@uživatelské jméno#8 (33)
$USER⊨ petr
@adresář pro dočasné soubory#9
${TMPDIR-/tmp}

5/3 Proměnné ovládající programy a systém

@vypnout lokalizaci a podporu Unicode#1 (34)
LC_ALL=C
@vypnout lokalizaci, ale ponechat kódování UTF-8#2
LC_ALL=C.UTF-8
@preferovaná časová zóna#3
TZ=UTC
TZ=Europe/Prague
@nelokalizovat výpisy a hlášení#4
LC_MESSAGES=C.UTF-8
@požádat aplikaci o použití určitého dočasného adresáře#5
TMPDIR=/absolutní/cesta

5/4 Preferované aplikace

Poznámka: proměnné prostředí EDITOR, VISUAL a PAGER se obvykle nastavují v souboru „~/.bashrc“.

@výchozí textový editor (terminálový/grafický)#1
EDITOR=/bin/nano
VISUAL=/usr/bin/gedit
@výchozí terminálový stránkovač#2
PAGER=/usr/bin/less

5/5 Prostředí jiných procesů

@mohu číst prostředí daného procesu?#1
test -r /proc/PID/environ
@vypsat seznam proměnných#2
sed -zE 's/=.*//' /proc/PID/environ | tr \\0 \\n [| sort]
@je proměnná definovaná/neprázdná?#3
egrep -zq '^název_proměnné=' /proc/PID/environ
egrep -zq '^název_proměnné=.' /proc/PID/environ
@přečíst hodnotu#4
sed -znE 's/^název_proměnné=//;T;p' /proc/PID/environ | tr -d \\0

5/6 Proměnné pro programátory

@cesty pro vyhledávání sdílených knihoven#1 (35)
LD_LIBRARY_PATH=cesta[:další/cesta]
@vypsat ladicí informace ohledně sdílených knihoven#2 (36)
LD_DEBUG=libs[,symbols] [LD_DEBUG_OUTPUT=předpona/výstupní/cesty]
@vynutit načtení funkcí ze zadané sdílené knihovny do aplikace (nezkoušeno, bez záruky).#3
LD_PRELOAD=/home/petr/moje.so

6. Instalace na Ubuntu

Všechny použité nástroje jsou základní součástí Ubuntu, přítomné i v minimální instalaci.

7. Tipy a zkušenosti

  • Pozor! Kolem znaku „=“ při přiřazování do proměnných nesmí být žádné bílé znaky! Jedinou výjimkou je tzv. aritmetický kontext (tedy např. uvnitř konstrukce „$(( prom = 1 + 1 ))“).
  • Náhradní řetězce a vzorky v pokročilých formách dosazení (např. „${X%.txt}“) vytvářejí nový kontext pro odzvláštnění, ve kterém můžete použít podle potřeby zpětná lomítka, uvozovky, apostrofy, a dokonce vnořené dosazení proměnných! Takže chcete-li např. dosadit hodnotu proměnné X po odebrání podřetězce „%\}“ z jejího konce, použijte tvar "${X%'%\}'}".
  • Do řetězcových proměnných můžete ukládat jakékoliv znaky UTF-8 kromě nulového bajtu, takže konce řádek, tabulátory, Escape apod. nejsou žádný problém.
  • Pokud potřebujete v asociativním poli použít jako klíč prázdný řetězec (což není dovoleno), pomůže upravit kód tak, aby před každý klíč vkládal konkrétní písmeno (např. „X“) a před výpisem toto písmeno zase odstraňoval (např. „${klíč#X}“).
  • Velkými písmeny (např. HOME či HISTSIZE) se píšou názvy proměnných, které mají řídicí či systémový význam, ať už jde o proměnné prostředí či jen interpretu. Vaše uživatelské proměnné ve skriptech nazývejte malými písmeny (např. „cesta_zpet“), popř. kombinací malých a velkých písmen (např. „CestaZpet“).
  • Znak ~ se v bashi rozvíjí na hodnotu „${HOME}“, proto ho uvnitř dvojitých uvozovek (kde by se nerozvinul) můžete vždy snadno a bezpečně nahradit za „${HOME}“.
  • Funkce se může jmenovat stejně jako proměnná.
  • V bashi vznikají proměnné automaticky při prvním přiřazení, není tedy třeba je deklarovat. Ve výchozím nastavení navíc pokus o dosazení neexistující proměnné povede k dosazení prázdného řetězce bez jakékoliv chyby (toto lze změnit nastavením „set -u“).
  • Při čtení prostředí ostatních procesů je třeba si dát pozor na to, že bash změny exportovaných proměnných nereflektuje do svého vlastního prostředí, ale až do prostředí procesů, které spustí (počítá se i spuštění příkazem „exec“).

8. Další zdroje informací

9. Zákulisí kapitoly

V této verzi kapitoly chybí:

  • zvláštní proměnné interpretu Bash, které řídí jeho funkci, ale nebývají proměnnými prostředí
  • lokální proměnné ve funkcích (pokryty nedostatečně)
  • možnosti přednastavení proměnných v souborech jako /etc/environment, „.profile“ či „.bashrc“

Tato kapitola záměrně nepokrývá:

  • zvláštní parametry (jako např. $?, $! apod.)
  • pattern matching (patřil by do jiné kapitoly)
1 Pozor! Příkaz „unset“ uspěje i tehdy, pokud daná proměnná neexistuje.
2 Pozor! Zapnutí této konverze nezmění stávající hodnotu proměnné, účinek nastane až při následujícím přiřazení!
3 Názvy proměnných se dosadí jako samostatné parametry (podobně jako u speciálního parametru $@).
4 Prvky pole se zadávají stejně jako parametry příkazu, tzn. oddělují se mezerami; obsahují-li zvláštní znaky, budou interpretovány, pokud je neodzvláštníte (vhodné je umístění do uvozovek či apostrofů).
5 V případě potřeby změňte názvy pomocných proměnných „i“, „j“ a „x“.
6 Je dovoleno přiřadit do prvku libovolně daleko za koncem pole; Bash v takovém případě pole automaticky prodlouží prázdnými řetězci, aby index byl platný.
7 Výřez se dosadí jako samostatné parametry (podobně jako u zvláštního parametru $@).
8 Pozor! Vkládání prvků na začátek je v případě rozsáhlého pole velmi pomalé! Snažte se mu vyhnout a vkládat prvky raději na konec. Pro vložení prvku doprostřed použijte spojování polí (které je ale také pomalé).
9 Tyto tvary uvádějte vždy ve dvojitých uvozovkách. Klíč se v tomto případě vyhodnocuje, jako by byl sám uvnitř samostatných dvojitých uvozovek, což umožňuje i vícenásobné vnoření této konstrukce, ačkoliv to je špatně čitelné.
10 Uvozovky kolem klíče slouží pouze k odzvláštnění znaků klíče, můžete je odzvláštnit i jinak, např. zpětným lomítkem či apostrofy.
11 Pokud je uzavírací závorka „}“ na stejném řádku jako poslední příkaz těla funkce, musí být od příkazu oddělená středníkem.
12 Exportované funkce se uloží do zvláštních proměnných prostředí a další instance bashe, která je tímto způsobem „zdědí“, je opět načte jako funkce. Doporučuji exportování funkcí příliš nepoužívat, protože tak můžete snadno ztratit kontrolu nad tím, kam všude se vaše funkce dostanou.
13 Tento test odpoví kladně i v případě, že půjde o pole celočíselných hodnot či asociativní pole celočíselných hodnot.
14 Hodnoty přiřazené do celočíselných proměnných se automaticky vyhodnocují jako výrazy a konvertují na celé číslo. Místo každého druhého názvu proměnné v uvedeném příkazu pochopitelně můžete uvést novou hodnotu proměnné, a to i výrazem.
15 Pozor! Účinek této deklarace nastává až při následujícím přiřazení. Pokud tedy deklarované pole či asociativní pole již obsahuje neceločíselné hodnoty, zůstanou v původní podobě, dokud nebudou přepsány!
16 Poznámka: jmenným odkazem nelze odkazovat na normální ani asociativní pole!
17 Konstanta je proměnná interpretu (popř. prostředí), kterou nelze zrušit ani později změnit její hodnotu (bez použití opravdu škaredých a nespolehlivých hacků). Lze ji však změnit z proměnné interpretu na proměnnou prostředí a naopak. Jde-li o proměnnou prostředí, vytvořené procesy (včetně dalších instancí bashe) ji zdědí již jako obyčejnou (přiřaditelnou) proměnnou prostředí.
18 Hodnota bude typicky v apostrofech či konstrukci „$''“. Konkrétní tvar se může lišit, ale vždy bude možno ho bezpečně dosadit do skriptu.
19 Tuto konstrukci lze skombinovat s většinou ostatních druhů dosazení.
20 Tyto tvary uvádějte vždy ve dvojitých uvozovkách. Klíč se v tomto případě vyhodnocuje, jako by byl sám uvnitř samostatných dvojitých uvozovek, což umožňuje i vícenásobné vnoření této konstrukce, ačkoliv to je špatně čitelné.
21 Nemá-li proměnná zapnutý žádný atribut, dosadí se prázdný řetězec.
22 Pokud má náhradní řetězec obsahovat zvláštní znaky či znak „}“, doporučuji uzavřít jej do dvojitých uvozovek. To funguje i tehdy, pokud je dosazovací výraz jako celek použit uvnitř dvojitých uvozovek.
23 Nebude-li splněna podmínka dosazení, dosadí se prázdný řetězec.
24 Tip: kolem indexu a délku mohou být mezery, kolem názvu proměnné ne.
25 První variantu lze použít pouze pro parametry $0 až $9. Druhou variantu (tu se složenými závorkami) lze použít i pro ostatní parametry (např. ${10}) a lze ji skombinovat s pokročilými formami dosazení.
26 Dvojité uvozovky zde znamenají, že pro správnou funkci musí být $@ (resp. $*) uvedeny uvnitř dvojitých uvozovek.
27 Výchozí N je 1. Pokud je pozičních parametrů méně než N, příkaz selže s návratovým kódem 1 a poziční parametry zůstanou nezměněné.
28 Parametry lze nastavit pouze najednou, přičemž se všechny stávající parametry (kromě $0) ztratí.
29 -i prostředí zcela vyprázdní; --unset z něj odebírá uvedené proměnné, přiřazení proměnné prostředí nastavuje a parametr „-C“ změní aktuální adresář.
30 Cesty jsou odděleny. Bývají absolutní, ale mohou být i relativní. Zahrnout aktuální adresář „.“ je možné, ale z bezpečnostních důvodů se to striktně nedoporučuje.
31 Pro textovou konzoli je to „linux“. Další hodnoty, se kterými se lze setkat, jsou „xterm“ a „rxvt“.
32 Jde-li o X-server, hodnota je „x11“, pro Wayland je to „wayland“, v textové konzoli je to „tty“.
33 Poznámka: proměnnou prostředí lze snadno podvrhnout. Pro bezpečné zjištění uživatelského jména použijte příkaz „id -un“.
34 Tato volba se zapíná především při řazení, kdy způsobí, že soubor se seřadí podle kódových hodnot bajtů. Hodí se také pro dosažení vyššího výkonu některých skriptovacích nástrojů, ale tam je potřeba, aby uživatel věděl, co dělá.
35 Když spuštěný program požádá systém o nahrátí sdílené knihovny, systém ji obvykle vyhledává v několika standardních adresářích. Má-li však program v prostředí proměnnou „LD_LIBRARY_PATH“, systém nejprve prohledává adresáře uvedené zde. V každém případě nahraje první nalezenou knihovnu a případné další knihovny téhož jména ignoruje.
36 Nápovědu k proměnné LD_DEBUG si můžete zobrazit příkazem „env LD_DEBUG=help cat“. Bez proměnné LD_DEBUG_OUTPUT se ladicí údaje vypíšou na standardní výstup; s ní se k jejímu obsahu připojí tečka a PID procesu a výpis se provede do daného souboru.
[BY-SA]

Veškerý obsah této stránky (text, obrázky, zdrojový kód) je možno upravovat a šířit pod podmínkami licence Creative Commons Attribution-ShareAlike 4.0 International. Upozorňuji, že uvedená licence vyžaduje uvedení seznamu autorů, licence a zdroje a poskytnutí stejné či kompatibilní licence k provedeným změnám, jsou-li nějaké. Příslušné údaje jsou dostupné na stránce „Přehled autorů“. Šíření obsahu bez těchto údajů nebo šíření upravené verze bez poskytnutí adekvátní licence k provedeným úpravám je pravděpodobně porušení licenčních podmínek a může být postihováno. Poskytování zdrojového kódu při šíření není touto licencí vyžadováno.

Pro nové verze, další informace, aktuální zdrojový kód a možnost se zapojit do projektu „Linux: Kniha kouzel“ navštivte jeho repozitář na GitHubu.