Funkce a podmínky

Funkce

Pokud často používáte nějaký sled příkazů, hodí se jej umístit do funkce, kterou lze pak spouštět jediným příkazem. Třeba takto:

  #!/bin/bash
  
  function nase_funkce {
     echo "Kopiruji soubor ..."
     cp soubor.txt /tmp
     du -h /tmp/soubor
  }
  
  nase_funkce

Tohle je opět značně primitivní příklad, ale svůj účel plní. Vidíme, jak se funkce vytváří i jak se používá. Funkcím lze předávat parametry:

  #!/bin/bash
  
  function funkce {
     echo "Parametr funkce c. 1: $1"
     echo "Parametr funkce c. 2: $2"
  }
  funkce parametr1 parametr2

O parametrech funkcí i skriptů se ale dozvíme více později.

Podmínky

Průběh skriptu může někdy narazit na situaci, kde bude třeba o něčem rozhodnout. Za tímto účelem máme k dispozici podmínku:

  if [ podminka ]; then
    prikaz
  fi

To je nejjednodušší možná konstrukce podmínky. Pokud je podmínka podminka pravdivá, provede se prikaz. Je však možné konstruovat i složitější podmínky, třeba jako je tato:

  if [ vyraz1 ]; then
    prikaz1
  elif [ vyraz2 ]; then
    prikaz2
  else
    prikaz3
  fi

V tomto případě se provede prikaz1, jestliže je podmínka vyraz1 pravdivá. Pokud není, ale je pravdivá podmínka vyraz2, provede se prikaz2. Pokud ani tato podmínka pravdivá, provede se prikaz3. Ještě než zkusíme nějaký reálný příklad, povíme si více o podmínkách.

Výrazy v podmínkách

Podmínka je nějaký výraz, který nabývá určitých logických hodnot (pravda či nepravda). V zásadě, všechny podmínky interpretuje program test, takže když se podíváte do jeho manuálové stránky, objevíte přehledný výpis všeho, co lze testovat. Já se pokusím o stručný vytah.

Podmínky obecně

Výraz Význam
(výraz) podmínka je pravdivá, je-li výraz pravdivý
! výraz podmínka je pravdivá, pokud výraz není pravdivý (negace)
výraz1 -a výraz2 podmínka je pravdivá, pokud jsou oba výrazy pravdivé (logická spojka AND)
výraz1 -o výraz2 podmínka je pravdivá, pokud je alespoň jeden z výrazů pravdivý (logická spojka OR)

Podmínky vztažené k řetězcům

Výraz Význam
-n řetězec řetězec je neprázdný
-z řetězec řetězec je prázdný
řetězec1 = řetězec2 řetězce jsou shodné
řetězec1 != řetězec2 řetězce jsou různé

Podmínky vztažené k (celým) číslům

Výraz Význam
číslo1 -eq číslo2 číslo1 = číslo2 (equals)
číslo1 -ge číslo2 číslo1 ≥ číslo2 (greater or equal)
číslo1 -gt číslo2 číslo1 > číslo2 (greater than)
číslo1 -le číslo2 číslo1 ≤ číslo2 (lower or equal)
číslo1 -lt číslo2 číslo1 < číslo2 (lower than)
číslo1 -ne číslo2 číslo1 ≠ číslo2 (not equal)

Některé podmínky vztažené k souborům

Výraz Význam
-e soubor soubor existuje
-f soubor soubor existuje a je to soubor
-d soubor soubor existuje a je to adresář
-h soubor soubor existuje a je to symbolický link
-b soubor soubor existuje a je to blokové zařízení
-c soubor soubor existuje a je to znakové zařízení
-p soubor soubor existuje a je to pojmenovaná roura
-s soubor soubor existuje a má nenulovou velikost
-S soubor soubor existuje a je to socket
soubor1 -nt soubor2 soubor1 je novější (newer than) soubor2
soubor1 -ot soubor2 soubor1 je starší (older than) soubor2

Seznam podmínek není úplný (v případě souborů), ale jak už jsem podotýkal, man test je vhodné si projít. Příklady různých výrazů si ukážeme v následující sekci.

Příklady různých podmínek

Pro začátek zkusme něco jednoduchého:

  if [ `grep -c ^michal /etc/passwd` -eq 0 ]; then
    echo "Uživatel 'michal' neexistuje."
  else
    echo "Uživatel 'michal' existuje."
  fi

Příkaz grep -c ^michal /etc/passwd vypíše počet řádků souboru /etc/passwd, které začínají na michal. Pokud je toto číslo nula, je jasné, že žádný uživatel michal v systému není. Jiným příkladem může být:

  if [ -f /var/run/mysqld.pid ]; then
    echo "MySQL server pravděpodobně běží."
  else
    echo "MySQL server neběží."
  fi

Podmínka testuje existenci souboru, který by měl být vytvořen po startu MySQL serveru (obsahuje PID běžící instance mysqld) a vymazán při jeho ukončení. Jistější by bylo použití programu ps, ale to by byl jednak příklad podobný předchozímu, a pak bych nemohl poukázat na to, že v GNU/Linuxu a shellu lze jednotlivé úlohy řešit různým způsobem, přičemž každá z variant může vést k cíli.

  if [ -z "$PROMENNA" ]; then
    echo "Proměnná je prázdná."
  else
    echo "Proměnná obsahuje '$PROMENNA'"
  fi

Tato podmínka testuje, je-li proměnná PROMENNA prázdná, přičemž pokud není, vypíše, co obsahuje.

Kam dál

pokrocili/komandlajna/funkce_podminky.txt · Poslední úprava: 2009/11/12 19:26 autor: Michal Dočekal
CC Attribution-Share Alike 3.0
www.chimeric.de Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 PDF Export