int21h

Programování v Bashi

Možná se někomu zdá, že v časopise o tak starých věcech jako asm a DOS by se o tak nových záležitostech jako je Linux mluvit nemělo.
Interpret bash (Bourne again shell) je odvozen od jazyku sh (Bourne shell), což byl vůbec první příkazový jazyk na systému Unix. Systém Unix je starší než Dos, a to dokonce o nějakých deset let. Přesto je tento interpret takřka nepřekonaný.
Jeho síla tkví v těchto základních bodech:

o Definování funkcí
o Přesměrování vstupu a výstupu
o Podporuje proměnné
o Obsahuje zálkadní konstrukce běhu (for,while,case,if..)
o Vytváření dávkových programů na úrovni kompilovatelných jazyků

No dobře, řekne si pravý dosař. To všechno zvládá i command.com, ne?
To je pravda. Zhruba. Ale zkoušeli jste někdy psát smyčku for v dosu? Práce s proměnnými?
A přesměrování i/o a roury. Narozdíl od Dosu dokáže Unix vypisovat a příjimat i binární soubory. (Což bude tím, že v Unixu rozdělení binární/textový neexistuje)

Můžeme si dovolit třeba následující zřetězení:
find int21h_?* -name "*.html"|grep -v "r_"|grep -v "index.html"|sed 's/int21h_.///g'
(Což je mimochodem zjednodušený program, který používám na generování map článků)

"Dávkové soubory"


No dobře, tak začneme helloworldem.
#!/bin/bash
echo "Hello, world!"  
Spustitelné, textové nebo datové soubory je v Unixu to samé, protože spustitelnost se nastavuje jako atribut souboru.
Pokud napíšeme soubor obsahující jednotlivé řádky intepretru a nastavíme ho na spustitelný (chmod 755 file), tak se bude provádět řádek za řádkem automaticky. Pro takový soubor se vžilo pojmenování Script - Odtud scriptovací jazyk.
Na Unixu však existuje interpretrů více, tak se to řeší tímto způsobem:
Na první řádek scriptu se přidá toto:

#!{cesta k interpretru} - například
#!/bin/bash - /bin/bash je program intepretru

Protože, ale není jasné kde se který interpretr nachází používá se program env, který by už měl být vždy na stejném místě. Příklad
#!/usr/bin/env bash
Tímto způsobem se dají psát scripty v jakémkoli scritpovacím jazyce jako je Perl nebo Python.
Základní konstrukce
Je dobré si uvědomit, že pro většinu problémů už byl napsán program nebo sada programů, které ho dokáží vyřešit. Pokud je uživatel schopen tyto programy vhodně posojovat, nemusí už programovat speciální program.

Parametry
Všechny parametry se uloží do globálních proměnných jako
$1 $2 $3 $4.. atd. To je podobný jako v DOSu.
Pokud nevíme předem kolik parametrů bylo předáno použijeme příkaz shift, který všechny indexy posune. $1=$2 $2=$3 $3=$4...

V intepretru je důležitá ještě jedna věc, která v command.com dost pokulhává.
stdin stdout stderr - neboli vstup výstup chybový výstup.
Příklady přesměrování:
ls *.txt > file - stdout do souboru
ls *.txt 2> file - stderr do souboru
ls *.txt 2>&1 - stderr do stdout
ls *.txt 1>&2 - stdout do stderr
ls *.txt &> file - stdout a stderr do souboru

Podmínky


Nejzákladnější řídící příkaz je samzřejmě if
Syntaxe v Bashi je přibližne taková:
if podmínka
then
	příkazy
else
	příkazy
fi  
Část else je samozřejmě nepovinná
Příkaz if má v sobě již zabudovaný program test. Proto namísto:
if test $1 -w -f -r then
	echo "Muzes prepsat"  

můžeme napsat:
if [ $1 -w f -r ] then
	echo "Muzes prepsat"  

Smyčky


Smyčky for while until
until je smyčka s podmínkou na konci. (Takže něco jako repeat until(pas) nebo do while(c)
for
základní příklad:
for i in $(ls *.txt)
do
	echo "soubor: $i"
done  
$(string) znamená, že se string vykoná jako příkaz a výsledek vrací.
můžeme to však zapsat jako
for i in *.txt
do
	echo "soubor: $i"
done  
Nebo na řádku:
for i in *.txt;do echo "soubor: $i"; done  
protože bash tyto wildcards rovnou expanduje.
While
Použití téměř shodné s c
while true
do
 echo "something"
done

  
Until
until true
do
 echo "something"
done 

  

Funkce


Základní syntaxe je:
function name {
	echo "something"
}

  
Toto je funkce, která nemá žádné parametry a nic nevrací.
To co má funkce vrátit se dává jako parametr příkazu return
K parametrům funkcí se přistupuje úplně stejně jako s parametry programu (viz výše)

Výrazy


Vyhodnocování výrazů má bash přímo zabudovaný.
Příklad:
$[1+1]=0
nebo
$((1+1))=0
co je vám milejší.
Často používaná je taky proměnná $RANDOM, která obsahuje náhodné číslo z generátoru. ($RANDOM%6=[0..5]). Tyto výrazy můžete vložit do podmínek.

Závěr


Tak tohle jsou opravdu jen úplné základy. Doporučuju se podívat na http://www.linuxdocs.org a najít tam Bash-Programming-Intro, protože je to celkem obstojná učebnice. Jinak ten samý HOWTO je teké v LDP (Linux Dokumentační Projekt).
Programování v Basi by se mělo stát pro každého Linuxového guru naprostou samozřejmostí a pravý Unixář se pozná tak, že přejmenování i pěti souborů je už práce pro skript :)

A na závěr, toto je skript, který jsem napsal pro generování map pro náš časopis
#!/bin/bash
# Generator of magazines maps
# by BOby (<) 2006


echo ''
echo ''
echo 'Mapa clanku'
echo '" content="text/html;charset=iso-8859-2" />'
echo '" type="text/css" href="style.css" />'
echo ''


echo ''
echo '<h1>Mapa článků</h1>'


for d in int21h_*;
do
	name=`echo $d|sed 's/int21h//gi'`
	echo "<a href="users/BOby/$d/index.html"><h2>Číslo $name</h2></a>"
	echo '<ul>'
	for i in `(find $d -name "*.htm*"|grep -v "index.html"|grep -v "/r_")`; 
	do 
		descript=`head $i|grep "<title>"|sed 's/<title>//gi'|sed 's/</title>//gi'`
		name=`echo $i|sed "s/$d///ig"`
		echo "<li><a href="$i">$descript</a> - $name</li><br />;
	done
	echo '</ul>'
done


echo '<br />'
echo '<br />'
echo "Vygenerováno programem $0 `date +"%d/%m/%y v %H:%M:%S"`"
echo '<br />'
echo '<br />'
echo 'by <span class="green">BOby'


echo '</body>'
echo '</html>'
2006-11-30 | BOby
Reklamy:
Ronnie.cz - kulturistika, fitness, bojové sporty