Shell-programozás
Ezen az oldalon összeszedek néhány olyan megoldást, ötletet, scriptrészletet, amit gyakran jól használhatunk a rendszeradminisztráció során. Nem célom a shell, mint programozási nyelv teljes bemutatása. Kizárólag Bourne jellegű shellekkel foglalkozom, és azon belül is főként zsh-val.
És azért persze nem maradhat ki a sed sem.
1 Az idézőjelek használatáról
A "dupla" idézőjelek között a shell nem értelmezi speciálisan a *, ?, [, ], {, }, ;, <, >, stb. karaktereket (nincs globbing), viszont pl. működik a változókra való hivatkozás és a külső parancs kimenetének behelyettesítése.
Pl.:
echo "files matching \"*.txt\": $(echo *.txt)"
Az 'aposztrófok' között a shell (szinte?) semmilyen speciális karaktert nem értelmez, még a dollárjelet sem, úgyhogy tetszőleges szöveget írhatunk aposztrófok közé betű szerint:
echo 'Value of $PATH='"$PATH"
- Magát az aposztrófot sehogyan sem tudjuk aposztrófok közé írni, mivel a backslash is elveszíti a szokásos escape-funkcióját.
- A kétféle idézőjelen belül mindig szabadon használhatjuk a másik fajtát:
echo "Couldn't change directory" echo 'files matching "*.txt":' $(echo *.txt)
A `backtickek` közé írt parancssor standard outputját a shell behelyettesíti oda, ahol a backtickes kifejezés szerepelt, de jobb ehelyett a $(zárójeles) alakot használni, mivel az szabadon egymásbaágyazható.
#!/bin/sh DIR=$(date +%Y%m%d) OPER=${@:-dist-upgrade} mkdir $DIR cd $DIR || exit 1 for i in $(echo n | apt-get -d -u $OPER 2>&1 | grep '^[[:space:]]' | tr -d '*'); do ls | grep -q ${i}_ || dpkg-repack $i done
2 Alapértelmezések használata
Ha egy változó értékét egy script felhasználója megadhatja, de nem kötelező megadnia, akkor gyakran szeretnénk valamilyen alapértelmezett értéket adni a változónak.
Az alábbi példa rossz:
FOO=defaultérték FOO=$1
Ha a scriptet paraméter nélkül hívták, FOO értéke az üres sztring lesz.
Ehelyett használhatjuk az alábbi bonyolult megoldást:
if [ -z "$1" ]; then FOO=defaultérték else FOO="$1" fi
Ez működik, de nem túl tömör.
Az if-től megszabadulhatunk a következő módon:
[ -z "$1" ] && FOO=defaultérték || FOO="$1"
De még ennél is egyszerűbb, ha csak annyit írunk, hogy
FOO=${1:-defaultérték}
3 Konfigurálható script
- A konfigurációkezelés kézenfekvő módja a VÁLTOZÓ=érték párokat tartalmazó script-töredék source-olása a "." paranccsal.
- Ha kezelünk parancssori argumentumokat:
- A script elején töltsük be a konfigurációt; azokat a defaultokat, amiket sem a konfiguráció, sem a parancssor nem ír felül, valahogy így juttathatjuk érvényre:
FOO=${1:-${FOO:-defaultérték}}
(itt ugye $1-nek volt a legnagyobb precedenciája, aztán jött a configfile, aztán a kódba drótozott default).
- A script elején töltsük be a konfigurációt; azokat a defaultokat, amiket sem a konfiguráció, sem a parancssor nem ír felül, valahogy így juttathatjuk érvényre:
- Ha nem kezelünk parancssori argumentumokat, még egyszerűbb a dolog:
- a script elején állítsunk be minden változót az alapértelmezésre, majd
- töltsük be a konfigurációt. Ami szerepel benne, az felülírja a defaultot, ami nem, az meg marad default.