- Overzicht
- Over variabele notatie
- Stap 1: Speciale tekens (metatekens)
- Stap 2: Speciale variabelen
- Stap 3: Parameterexpansie
- Stap 4: Arrays en associatieve arrays
- Stap 5: Rekenkundige expansie
- Stap 6: Vergelijkingen en condities
- Stap 7: Commandovervanging en subshell
- Stap 8: Redirectie en bestandsdescriptors
- Uitleg: Bestandsdescriptors (FD)
- Stap 9: Traps en foutenafhandeling
- Stap 10: Jobbeheer
- Stap 11: Speciale commando’s en gereserveerde woorden
- Samenvatting
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.
