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:
| Kuju | Mis juhtub |
|---|---|
bash tervita.sh Mari | Bash loeb faili; käivitusõigust pole vaja |
chmod u+x tervita.sh, seejärel ./tervita.sh Mari | fail käivitub shebang-rea järgi |
sh tervita.sh Mari | valitakse sh, isegi kui shebang nimetab Bashi |
bash -n tervita.sh | kontrollitakse 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:
| Kirjapilt | Tähendus |
|---|---|
$0 | skripti käivitamisel kasutatud nimi, mitte jooksva shelli nimi |
$# | argumentide arv |
$1 | esimene 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 ...; fi | tingimuse õnnestumisel käivitatav haru |
for nimi in "$@"; do ...; done | korda tegevust iga argumendiga |
>&2 | suuna teade veaväljundisse |
exit 1 / exit 0 | lõ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
- Käivita skript ühe, kolme ja null argumendiga. Kontrolli iga kord lõpetuskoodi.
- Anna nimeks
'Mari Maasikas'. Miks on jutumärgid vajalikud nii käsureal kui skripti"$@"ümber? - Lisa skripti enne tsüklit rida, mis kuvab argumentide arvu. Testi süntaksit enne käivitamist.
- 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 veajuhtumitecho $?vaata lõpetuskoodibash skript.shkäivita Bashigash skript.shkäivita sh-ga./skript.shkasuta shebang-rida
Olulisemad lipud, märgid ja kiirnupud
#!/usr/bin/env bashvali Bash$1esimene argument"$@"kõik argumendidif ... fitingimusfor ... donekordusexit 0 / exit 1edu või viga