Volledige gids voor speciale Bash-syntaxis, variabelen en uitbreidingen

Overzicht

Dit artikel biedt een systematisch overzicht van alle speciale syntaxis, variabelen, uitbreidingsregels en controlestructuren die in de Bash-shell worden gebruikt.


Over variabele notatie

Dynamische of omgevingsafhankelijke waarden worden aangeduid als <<variabele>>, met expliciete voorbeelden.

Variabele Voorbeeld Beschrijving
<<var>> name, path, user Algemene variabele
<<default>> guest, 8080 Standaard- of alternatieve waarde
<<pattern>> *.txt, */ Bestands- of tekenpatroon
<<offset>> 0, 3 Beginpositie van substring (0-gebaseerd)
<<length>> 4, 10 Lengte van substring
<<prefix>> ENV_, HOST Begin van variabelenaam
<<index>> 0, 1, 2 Index of sleutel in array
<<file>> /tmp/test.txt Bestandspad

Stap 1: Speciale tekens (metatekens)

Symbool Betekenis Voorbeeld
* Komt overeen met willekeurige tekenreeks ls *.txt
? Komt overeen met één willekeurig teken ls ?.sh
[a-z] Reeksdefinitie ls [A-Z]*
{a,b} Bracering mv {hoge,huga}
{1..3} Numerieke reeks touch file{1..3}.txt
$ Variabele-expansie echo $HOME
! (negatie) Logische negatie [[ ! -f test.txt ]]
! (geschiedenis) Commando-herhaling !10
~ Thuisdirectory cd ~
; Commando-separator pwd; ls
&& Alleen bij succes make && echo OK
` `
& Achtergrondproces sleep 5 &
` ` Pijp
> Standaarduitvoer naar bestand echo hi > out.txt
>> Toevoegen aan bestand echo hi >> out.txt
< Standaardinvoer van bestand wc -l < file.txt
() Subshell (cd /tmp; ls)
{} Zelfde shell { echo A; echo B; }
\ Escape-teken echo \$HOME
' ' Letterlijk (geen expansie) echo '$USER'
" " Expansie actief echo "$USER"

Stap 2: Speciale variabelen

Variabele Beschrijving Voorbeeld
$0 Scriptnaam echo $0
$1–$9 Argumenten echo $1
$@ Alle argumenten for a in "$@"; do echo $a; done
$# Aantal argumenten echo $#
$? Exitcode van vorige commando ls /nope; echo $?
$$ PID van huidig proces echo $$
$! PID van laatste achtergrondtaak sleep 10 & echo $!
$- Actieve shellopties echo $-
$_ Laatste argument van vorige commando echo $_
$PPID PID van ouderproces echo $PPID
$RANDOM Willekeurig getal (0–32767) echo $RANDOM
$SECONDS Tijd sinds shellstart echo $SECONDS
$FUNCNAME Functienaam myf(){ echo $FUNCNAME; }; myf
$PIPESTATUS[@] Exitcodes van pijpcommando’s `ls

Stap 3: Parameterexpansie

Syntaxis Betekenis Voorbeeld
${<<var>>} Variabele-expansie name=user; echo ${name}
${<<var>>:-<<default>>} Gebruik standaard als ongedefinieerd echo ${user:-guest}
${<<var>>:=<<default>>} Wijs toe als ongedefinieerd echo ${port:=8080}
${<<var>>:+alt} Gebruik alt als gedefinieerd x=1; echo ${x:+OK}
${<<var>>:?msg} Foutmelding als ongedefinieerd echo ${config:?config missing}
${#<<var>>} Lengte van tekenreeks name=user; echo ${#name}
${<<var>>%<<pattern>>} Verwijder kortste match van einde path=/a/b/c; echo ${path%/*}
${<<var>>%%<<pattern>>} Verwijder langste match van einde echo ${path%%/*}
${<<var>>#<<pattern>>} Verwijder kortste match van begin echo ${path#*/}
${<<var>>##<<pattern>>} Verwijder langste match van begin echo ${path##*/}
${<<var>>/<<pattern>>/<<repl>>} Vervang eerste match echo ${msg/foo/bar}
${<<var>>//<<pattern>>/<<repl>>} Vervang alle matches echo ${msg// /_}
${<<var>>:<<offset>>} Substring vanaf offset s=abcdef; echo ${s:2}
${<<var>>:<<offset>>:<<length>>} Substring met lengte echo ${s:1:3}
${!<<prefix>>*} Lijst van variabelen met prefix HOST1=x; HOST2=y; echo ${!HOST*}
${!<<var>>} Indirecte verwijzing ref=NAME; NAME=user; echo ${!ref}
${<<var>>,} / ${<<var>>^^} Hoofd-/kleine letters n=abc; echo ${n^^}
${<<var>>@Q} Gequote expansie x='abc'; echo ${x@Q}

Stap 4: Arrays en associatieve arrays

arr=(a b c)
echo ${arr[<<index>>]}
echo ${#arr[@]}
for i in "${arr[@]}"; do echo $i; done

declare -A map
map[<<index>>]=100
map[name]=user
echo ${map[<<index>>]}
echo ${!map[@]}

Stap 5: Rekenkundige expansie

x=5
y=3
echo $((x + y))
((x *= 2))
echo $x

Stap 6: Vergelijkingen en condities

if [ "$USER" = "root" ]; then echo root; fi
if [ "$x" -lt 10 ]; then echo "klein"; fi
if [ -f /etc/passwd ]; then echo "bestaat"; fi
s="hello123"
[[ $s =~ [0-9]+ ]] && echo "bevat getal"

Stap 7: Commandovervanging en subshell

echo "Vandaag: $(date +%Y-%m-%d)"
(cd /tmp; ls)

Stap 8: Redirectie en bestandsdescriptors

echo "Hallo" > <<file>>
echo "Toevoegen" >> <<file>>
wc -l < <<file>>
ls /notfound 2> err.log
echo "OK" >&2
exec 3> custom.log
echo "via fd3" >&3
exec 3>&-

Uitleg: Bestandsdescriptors (FD)

FD Naam Beschrijving Voorbeeld
0 stdin Standaardinvoer < file.txt
1 stdout Standaarduitvoer echo test > out.txt
2 stderr Foutuitvoer ls /nope 2> err.log
3+ Aangepaste FD Eigen stream exec 3> log.txt

FD3 is een door de gebruiker gedefinieerde descriptor, bijvoorbeeld:

exec 3> process.log
echo "Start uitvoering" >&3
exec 3>&-

Stap 9: Traps en foutenafhandeling

set -e
set -u
set -x
set -o pipefail

trap 'echo Beëindigd' EXIT
trap 'echo Fout opgetreden' ERR

Stap 10: Jobbeheer

sleep 10 &
jobs
fg %1
bg %1
disown %1
kill %1

%1 verwijst naar jobnummer 1 binnen de huidige shell.


Stap 11: Speciale commando’s en gereserveerde woorden

:
true
false
source ~/.bashrc
eval "echo uitgevoerd"
{ echo A; echo B; }

Samenvatting

Dit artikel dekt alle speciale Bash-constructies, uitbreidingen, variabelen en besturingsstructuren.
Met deze kennis kun je betrouwbare, herbruikbare en veilige shellscripts ontwerpen en debuggen.