Beetaversioon: sisu on enamasti terviklik ja avalikuks katsetamiseks valmis, kuid vajab veel tehnilist, keelelist ja kasutatavuse kontrolli.

Peatüki vaade

Linux/Unix/macOS käsurea kiirõpik

Praegu loed peatükki Esimene shelliskript, mis kuulub osasse Osa IV: Tekst, otsing ja automatiseerimine.

Esimene shelliskript

Shelliskript on käske sisaldav tekstifail. Teeme ühe skripti, mis tervitab kõiki käsurealt antud nimesid ja teatab veast, kui ühtegi nime ei antud.

Kuidas skript käivitub

Esimene rida ehk shebang, näiteks #!/usr/bin/env bash, määrab tõlgendaja faili otse käivitamisel. env otsib Bashi PATH-ist. Käivitusõigus ja tõlgendaja valik on eri asjad:

KujuMis juhtub
bash tervita.sh MariBash loeb faili; käivitusõigust pole vaja
chmod u+x tervita.sh, seejärel ./tervita.sh Marifail käivitub shebang-rea järgi
sh tervita.sh Marivalitakse sh, isegi kui shebang nimetab Bashi
bash -n tervita.shkontrollitakse süntaksit, käske ei käivitata

sh ei pruugi toetada Bashi erisusi, näiteks massiive ja [[ ... ]] tingimust. Süntaksikontroll ei ole ohutuskontroll: korrektne skript võib siiski teha soovimatuid muudatusi. Ka hilisem süntaksiviga ei taga, et varasemad käsud pole jõudnud käivituda.

Argumendid, tingimus ja kordus

Enne terviknäidet selle ehitusklotsid:

KirjapiltTähendus
$0skripti käivitamisel kasutatud nimi, mitte jooksva shelli nimi
$#argumentide arv
$1esimene argument
"$@"kõik argumendid eraldi, säilitades tühikud nende sees
[ "$#" -eq 0 ]kontroll: kas argumentide arv on null; sulgude ümber on tühikud
if ...; then ...; fitingimuse õnnestumisel käivitatav haru
for nimi in "$@"; do ...; donekorda tegevust iga argumendiga
>&2suuna teade veaväljundisse
exit 1 / exit 0lõpeta veaga / edukalt

Loo fail

Tööta eraldi kataloogis. Here-doc <<'EOF' annab järgmised read käsu sisendiks kuni eraldi real oleva EOF-ini. Jutumärgid takistavad muutujate laiendamist faili loomise ajal; need peavad laienema alles skripti käivitamisel. > kirjutab olemasoleva tervita.sh üle.


mkdir -p ~/tmp/skripti-naide
cd ~/tmp/skripti-naide
cat > tervita.sh <<'EOF'
#!/usr/bin/env bash
if [ "$#" -eq 0 ]; then
  printf 'Kasuta: %s nimi...\n' "$0" >&2
  exit 1
fi
for nimi in "$@"; do
  printf 'Tere, %s!\n' "$nimi"
done
exit 0
EOF

printf asendab %s järgmise argumendi tekstiga ning \n lõpetab rea.

Proovi edu ja viga

Kontrolli süntaksit. Vaikse eduka kontrolli järel anna omanikule käivitusõigus:


bash -n tervita.sh
chmod u+x tervita.sh
./tervita.sh Mari 'Jaan Tamm'

Tulemus on kaks tervitust, mitte kolm:


Tere, Mari!
Tere, Jaan Tamm!

Proovi ka puuduvat sisendit:


./tervita.sh
echo $?

Näed kasutusjuhist ja arvu 1. $? sisaldab vahetult eelmise käsu lõpetuskoodi: mõni vahele käivitatud käsk asendaks selle oma tulemusega.

Shebang töötab ka teiste keeltega: #!/usr/bin/env python3 valib Pythoni, kuid faili sisu peab siis olema Pythoni kood. Selline fail on Pythoni skript, mitte shelliskript. Pikem võrdlus on kompileerimise ja käivitamise peatükis.

Minitest

  1. Käivita skript ühe, kolme ja null argumendiga. Kontrolli iga kord lõpetuskoodi.
  2. Anna nimeks 'Mari Maasikas'. Miks on jutumärgid vajalikud nii käsureal kui skripti "$@" ümber?
  3. Lisa skripti enne tsüklit rida, mis kuvab argumentide arvu. Testi süntaksit enne käivitamist.
  4. Muuda veajuhist nii, et kasutaja näeks üht korrektset käivitusnäidet. Veateade peab endiselt minema veaväljundisse.

Peatüki täisspikker

Töövood

Eesmärk

esimese shelliskripti tuum on viis asja: shebang, käivitatavus, argumendid, lihtne tingimus ja lõpetuskood

Põhikujud

  • chmod +x tervita.shtee käivitatavaks
  • ./tervita.sh Mari Jaankäivita argumentidega
  • ./tervita.shnäe veajuhtumit
  • echo $?vaata lõpetuskoodi
  • bash skript.shkäivita Bashiga
  • sh skript.shkäivita sh-ga
  • ./skript.shkasuta shebang-rida

Olulisemad lipud, märgid ja kiirnupud

  • #!/usr/bin/env bashvali Bash
  • $1esimene argument
  • "$@"kõik argumendid
  • if ... fitingimus
  • for ... donekordus
  • exit 0 / exit 1edu või viga