Shell-programozás

A Unix/Linux szerverek üzemeltetése wikiből
A lap korábbi változatát látod, amilyen KornAndras (vitalap | szerkesztései) 2007. október 29., 19:41-kor történt szerkesztése után volt.

(eltér) ←Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

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
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
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 || FOO="$1"

De még ennél is egyszerűbb, ha csak annyit írunk, hogy

FOO=${1:-default}<pre>
Személyes eszközök