title | subtitle | author | date |
---|---|---|---|
4.2. Scripting 102 |
Linux<br/>HOGENT toegepaste informatica |
Thomas Parmentier, Andy Van Maele, Bert Van Vreckem |
2024-2025 |
Bij uitvoeren van script zijn opties en argumenten beschikbaar via variabelen, positionele parameters
Variabele | Betekenis |
---|---|
${0} |
Naam script |
${1} , ${2} , ... |
Eerste, tweede, ... argument |
${10} |
Tiende argument (accolades verplicht!) |
${*} |
Alle argumenten: ${1} ${2} ${3}... |
${@} |
Alle argumenten: "${1}" "${2}" "${3}"... |
${#} |
Aantal positionele parameters |
Het commando shift
schuift positionele parameters op naar links:
${1}
verdwijnt${2}
wordt${1}
${3}
wordt${2}
- enz.
set par1 par2 par3
echo "${1}" # => par1
echo "${2}" # => par2
echo "${3}" # => par3
echo "${4}" # => (lege string)
- Elk commando heeft een exit-status, numerieke waarde
- Opvragen met
echo "$?"
- 0 => commando geslaagd, logische true
- 1-255 => commando gefaald, logische false
- Opvragen met
- Logische operatoren in Bash zijn gebaseerd op exit-status
- Booleaanse variabelen bestaan niet
if EXPR
then
# ...
elif EXPR
then
# ...
else
# ...
fi
if [ "${#}" -gt '2' ]; then
printf 'Expected at most 2 arguments, got %d\n' "${#}" >&2
exit 1
fi
while EXPR; do
# ...
done
until EXPR; do
# ...
done
counter=0
while [ "${counter}" -le '10' ]; do
echo "${counter}"
counter=$((counter + 1))
done
$(( ... ))
is arithmetic expansion
while read -r line; do
# process "${line}"
done < file.txt
Itereren over een lijst
for ITEM in LIST; do
# ...
done
for file in *.md; do
printf 'Processing file %s\n' "${file}"
# ...
done
for i in {1..10}; do
echo "${i}"
done
for i in {2..20..2}; do
echo "${i}"
done
for i in $(seq 1 10); do
echo "${i}"
done
for i in $(seq 2 2 20); do
echo "${i}"
done
"Klassieke" for-lus, komt slechts uitzonderlijk voor
for ((i=0; i<=10; i++)); do
echo "${i}"
done
while [ "$#" -gt 0 ]; do
printf 'Arg: %s\n' "${1}"
# ...
shift
done
for arg in "${@}"; do
printf 'Arg: %s\n' "${arg}"
# ...
done
Find is zelf een "lus", dus | while
is overbodig
# find | while is overbodig!
find . -type d | while read -r dir; do chmod 700 "${dir}"; done
Beter:
find . -type d -exec chmod 700 "{}" \;
-
Start met oefeningenreeks
script102
cd ~/linux-2122-scripts-USERNAME/script102
-
Opgave:
script102/README.md
of Chamilo-leerpad