Portál AbcLinuxu, 24. dubna 2024 16:10

BASH - VI

28. 11. 2003 | Jan Fuchs
Články - BASH - VI  

V posledním dílu seriálu si ukážeme, jak odchytávat signály, ladit skripty a nakonec několik praktických příkladů.

Obsah jednotlivých dílů

  1. Úvod, editace příkazové řádky
  2. Základní příkazy, roury a přesměrování
  3. Proměnné, podmínky a cykly
  4. Funkce a příkazy
  5. Dokumenty here, regulární výrazy
  6. Ladění skriptů, odchytávání signálů a příklady

Odchytávání signálů

Signály zaslané skriptu můžeme odchytávat pomocí příkazu trap.

Vyzkoušejte skript trap.sh.

#!/bin/bash

konec() {
  echo -n "Uklízím"

  i=0
  while [ "$i" -le 10 ]; do
    i=$((i + 1))
    echo -n "."
    sleep 0,1
  done

  echo
  echo "Konec"
}

trap '' INT
echo "Ctrl+C neudělá nic"
sleep 3

trap - INT
echo "Ctrl+C ukončí skript"
sleep 3

trap 'konec; exit 0' INT
echo "Ctrl+C spustí funkci konec a ukončí skript"
sleep 3

konec

echo "Skript proběhl až do konce"

exit 0

Ladění skriptů

Následující módy shellu nám mohou usnadnit ladění.

#!/bin/bash

set -o verbose
echo $PWD

set -o xtrace

echo $PWD

echo $(pwd)

set +o verbose
set +o xtrace

set +o nounset
echo $nedefinovana_promena

set -o nounset
echo $nedefinovana_promena

echo "Tento řádek se již nevypíše"

exit 0

Nyní si skript ladeni.sh spustíme a podíváme se na jeho výpis.

$ ./ladeni.sh
echo $PWD
/root/fuky/clanky/bash

set -o xtrace

echo $PWD
+ echo /root/fuky/clanky/bash
/root/fuky/clanky/bash

echo $(pwd)
pwd
++ pwd
+ echo /root/fuky/clanky/bash
/root/fuky/clanky/bash

set +o verbose
+ set +o verbose
+ set +o xtrace

./ladeni.sh: nedefinovana_promena: unbound variable

Praktické příklady

Úkol 1

Máme libovolnou adresářovou strukturu a v ní jsou uložené soubory *.wav, *.ogg a *.mp3.

Vytvoříme si skript oggwavmp3.sh.

#!/bin/bash

case "$1" in
  *.wav )
    #cesta="${1%/*}/"
    cesta=$(echo $1 | sed 
            's/^\(.\+\/\)\([^/]\+wav\)$/\1/')

    if [ -d "${cesta}ogg" ]; then
      :
    else
      mkdir "${cesta}ogg"
    fi

    #soubor="${1%.*}.ogg"
    #soubor="${soubor##*/}"
    soubor=$(echo $1 | sed 
             's/^\(.\+\/\)\([^/]\+\)\.wav$/\2.ogg/')
	     
    oggenc "$1" -Q -b 192 -o "${cesta}ogg/$soubor"
    ;;

  *.ogg )
    #soubor="${1%.*}.wav"
    soubor=$(echo $1 | 
             sed 's/\(.\+\)\.\(ogg\)$/\1.wav/')

    if [ "$soubor" ]; then
      sox "$1" "$soubor"
      rm "$1"
    fi

    ;;

  *.mp3 )
    #soubor="${1%.*}.wav"
    soubor=$(echo $1 | sed 
             's/\(.\+\)\.\(mp3\)$/\1.wav/')

    if [ "$soubor" ]; then
      mpg123 "$1" -q -w "$soubor"
      rm "$1"
    fi

    ;;

  * )
    ;;
esac

exit 0

Do souboru ~/.bashrc si přidáme alias a po dalším spuštění shellu můžeme začít využívat náš nový příkaz.

alias oggwavmp3='find -type f | xargs -i ~/bash/oggwavmp3.sh {}'

Úkol 2

Obesenec

Na závěr si zkuste udělat hru Oběšenec. Nastavení hry se provádí pomocí konfiguračního souboru. Lze vybrat, zda se bude rozlišovat diakritika či velikost písmen. Slova či věty jsou uloženy v souborech podle složitosti a jedna z možností nastavení je právě výběr jen některých souborů se slovy (větami). A nakonec je zde i možnost časového omezení při zadávání znaku (příkazu) - v případě, že čas vyprší, bude hráč ihned oběšen. Samozřejmě, že vám dám k dispozici i mé řešení obesenec-1.1.tgz, ale podívejte se na něj až problém sami vyřešíte nebo budete-li opravdu v úzkých.

Literatura

Závěr

A to je z našeho seriálu opravdu vše :-D. Máte poslední možnost zeptat se na věci, které se do našeho seriálu nevešly, nebo se na ně zapomnělo. Děkuji všem, kteří seriál průběžně komentují.

Seriál BASH (dílů: 6)

První díl: BASH - I, poslední díl: BASH - VI.
Předchozí díl: BASH - V

Související články

BASH - I
BASH - II
BASH - III
BASH - IV
BASH - V

Odkazy a zdroje

BASH - GNU Project

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.