abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Sledujte AbcLinuxu.cz na:
facebook favicon logo  Facebooku twitter favicon logo  Twitteru,   identi.ca favicon logo  Identi.ca,   rss logo  RSS
Rozšířené hledání
×
včera 22:22 | Zajímavý software
Webový prohlížeč Chrome v budoucnu asi nebude mít podporu pro online ověřování, zda nebyl HTTPS certifikát revokován (CRL). V odkazovaném článku je uvedeno několik důvodů pro tento krok, zejména pak to, že toto ověřování nemusí být spolehlivé a zpomaluje načítání stránek. Namísto toho je navrhována distribuce revokovaných klíčů přes aktualizační mechanismus prohlížeče.
Luboš Doležel (Doli) | Komentářů: 2
včera 22:18 | Zajímavý projekt
Grafický server Wayland, možný nástupce současného X Serveru, se své první stabilní verze 1.0 dočká možná už v druhé polovině tohoto roku, nejpozději však za rok. Tento plán prezentoval tvůrce Waylandu Kristian Høgsberg na konferenci FOSDEM, která během uplynulého víkendu probíhala v Bruselu.
Migilenik | Komentářů: 1
včera 22:17 | Pozvánky

Ve středu 15.2. od 18:00 proběhne na Fakultě informatiky Masarykovy univerzity v Brně únorové setkání Czech JBoss User Group. Tentokrát bude tématem vytváření opravdových Java EE aplikací s JBoss AS. Zahraničním hostem bude Pete Muir, který posluchačům ukáže, jak se taková aplikace vytváří. Více informací na wiki stránce akce.

Sešívaný | Komentářů: 0
včera 22:17 | Zajímavý projekt
Díky pomoci ze strany Google se v posledních pár dnech podařilo sepsat příručku pro začínající vývojáře v prostředí KDE. Tato kniha je dostupná nejen v podobě PDF/ePub, ale i v tištěné podobě.
Luboš Doležel (Doli) | Komentářů: 0
včera 22:14 | Zajímavý projekt
První hromadně vyráběné kousky laciného ARM minipočítače Raspberry Pi budou zhotoveny 20. února. Hned poté se započne s přepravou do Velké Británie, takže prodej by měl začít do konce měsíce. Druhou novinkou je zveřejnění datasheetu k SoC BCM2835, které je hlavním stavebním kamenem Raspberry Pi.
Luboš Doležel (Doli) | Komentářů: 0
včera 14:34 | Nová verze
Vyšla nová stabilní verze populárního ruského webového serveru nginx – 1.0.12. Seznam změn hovoří zejména o opravě několika chyb. Nově je možné v konfiguraci specifikovat verzi TLS u direktivy ssl_protocols a SSI příkaz if podporuje pojmenované zachycení (tzv. capture) v regulárních výrazech.
MMMMMMMMM | Komentářů: 5
včera 12:36 | Komunita
Phoronix upozorňuje, že svobodný ovladač Nouveau má funkční podporu pro OpenCL. Úvodní podpora se týká ovladače pro čipy NV50, tedy grafické karty GeForce 8, 9, 100, 200 a 300. Kód je zatím udržován v samostatné větvi.
Nicky726 | Komentářů: 2
včera 12:26 | Komunita
Vývojář Kubuntu Jonathan Riddell oznámil, že Canonical končí s financováním Kubuntu. Kubuntu tak bude komunitní distribucí jako jiné deriváty Ubuntu, skončí i možnost placené podpory a Jonathan se nebude moct ve své pracovní době věnovat Kubuntu.
Nicky726 | Komentářů: 46
včera 00:12 | Nová verze
Vyšla nová vanilla linuxová jádra 3.0.20 a 3.2.5. Přidán byl jediný patch, který upravuje nastavení ASPM (Active State Power Management) a tím snižuje spotřebu linuxového jádra. Posouzení nutnosti aktualizace nechává Greg Kroah-Hartman tentokrát na uživatelích.
Ladislav Hagara | Komentářů: 17
6.2. 22:56 | Nová verze
V Beta Channel se objevil Firefox 11 přinášející zajímavé novinky. Vylepšený Migration Tool nově umožňuje import informací i z prohlížeče Google Chrome, Firefox Sync zase (skrze Add-on Sync) synchronizaci doplňků mezi různými instalacemi Firefoxu. Přibyla i podpora protokolu SPDY. Vývojáře bude zajímat především nový 3D Web Inspector, který vznikl implementací rozšíření Tilt.
Migilenik | Komentářů: 0
Servery pro sdílení souborů (typu MegaUpload)
 (40%)
 (49%)
 (11%)
Celkem 498 hlasů
 Komentářů: 29, poslední včera 08:38
Rozcestník
Reklama
Autoškola testy online Levný benzín

Unixové nástroje – 15 (basename/dirname, test, read)

9. 7. 2010 | David Watzke | Návody | 4543×

V tomto díle si povíme něco o příkazech často používaných v shellových skriptech: basename/dirname, testread.

Obsah

basename a dirname

link

Tyto dva příkazy slouží k získání konkrétní části cesty k souboru. Oběma příkazům se zadává kompletní cesta k souboru či adresáři. Příkaz basename slouží k výpisu samotného názvu souboru či adresáře, který získá ze zadané cesty, zatímco příkaz dirname vypíše název nadřazeného adresáře.

$ basename /tmp/soubor.txt
soubor.txt

$ dirname /tmp/soubor.txt
/tmp

Toto se hodí v různých skriptech, které přímo pracují se soubory. V různých shellech lze tyto externí příkazy nahradit za (podstatně) rychlejší vestavěné funkce, například v Bashi lze použít toto:

$ cesta="/home/dave/file.ogg"
$ adresar="${cesta%/*}"
$ soubor="${cesta##*/}"
$ echo -e "cesta: $cesta\nadresar: $adresar\nsoubor: $soubor"
cesta: /home/dave/file.ogg
adresar: /home/dave
soubor: file.ogg

Ovšem zde je důležité podotknout, že chování těchto dvou metod není úplně stejné. Můžete si to zkusit například na tomto příkladu:

$ cesta="/tmp/xyz/"
$ basename "$cesta"
xyz
$ echo "${cesta##*/}
# nevypíše nic

Proč bashová metoda nevypíše nic? Protože ${cesta##*/} znamená odstranění části řetězce z proměnné $cesta od začátku až po poslední lomítko (včetně).

Příkaz basename má ještě jednu vlastnost. Zadáte-li jako druhý argument příponu, tak ji z názvu souboru odstraní. Tedy za předpokladu, že by to neznamenalo výpis prázdného řetězce a že byla daná přípona v názvu nalezena. Není-li daná přípona v názvu nalezena, není to považované za chybu.

$ basename "/tmp/velky_soubor.tar.xz" .xz
velky_soubor.tar

test

link

Příkaz test slouží k vyhodnocování různých výrazů a tvrzení. Použijete-li příkaz správně, tak vždy pouze vrátí návratovou hodnotu 0, nebo 1 jako signalizaci, že tvrzení platí, nebo neplatí, a nic nevypíše.

test dovede pracovat se soubory a adresáři. Umí ověřit, zda je soubor či adresář zapisovatelný (přepínač -w), spustitelný (-x), zda lze číst (-r) či zda vůbec existuje (-e). Dále umí zjistit, zda je soubor obyčejný soubor (-f), blokové zařízení (-b), znakové zařízení (-c), symbolický odkaz (-h nebo -L), pojmenovaná roura FIFO (-p), socket (-S) či adresář (-d).

# ověřuje, zda cesta „/“ ukazuje na adresář;
# vrátí 0 (pravda), protože kořenový adresář existuje vždy
test -d /

# ověřuje, zda existuje soubor /tmp/xyz
test -e /tmp/xyz

Pomocí test lze také zkoumat řetězce znaků.

# pravda, pokud je řetězec $X nenulový
test "$X"

# pravda, pokud jsou řetězce $A a $B stejné
test "$A" = "$B"

# pravda, pokud jsou řetězce navzájem různé
test "$B" != "$C"

# pravda, pokud je řetězec nulové délky;
# toto vrátí 0
test -z ""

Dále lze porovnávat celá čísla. Je možné použít operátory:

  • rovná se (-eq),
  • nerovná se (-ne),
  • větší než (-gt),
  • větší nebo rovno (-ge),
  • menší než (-lt) a
  • menší nebo rovno (-le).
# pravda, 150 je menší nebo rovno 150
test 150 -le 150

# nepravda, 100 = 100
test 100 -ne 100

Výrazy lze kombinovat pomocí přepínačů -a (logický AND, tedy „a zároveň“) nebo -o (logický OR, „nebo“). Dále je lze negovat přidáním vykřičníku před výraz. Můžeme také ovlivňovat prioritu vyhodnocování výrazů pomocí závorek.

# vrátí 1, protože minimálně druhý výraz neplatí (s -a musí platit oba)
test \( -w /tmp \) -a \( 100 -eq 101 \)

# pokud je adresář /tmp zapisovatelný, vrátí 0, protože platí alespoň jeden výraz
test \( -w /tmp \) -o \( 100 -eq 101 \)

# pravda, pokud soubor není zapisovatelný
test ! -w "soubor"

V praxi se test používá v shellových skriptech, nejčastěji v kombinaci s podmínkou if. Také se často místo test píše pouze hranatá závorka [, přičemž je to totéž, ale takto zapsaný příkaz je nutné ukončit opačnou hranatou závorkou ].

# toto:
test -x skript.sh
# je totéž jako toto:
[ -x skript.sh ]

Předvedeme si ukázkové použití v Bashi. Píšeme funkci my_mkdir, které zadáte název adresáře a ona jej vytvoří, pokud neexistuje. Ovšem nejdříve ověří, zda již neexistuje soubor či adresář stejného názvu a zařídí se podle toho (vypíše patřičnou informaci). Pomineme, že taková funkce nemá valný význam, protože mkdir podobné kontroly dělá sám.

my_mkdir() {
	# pokud soubor či adresář s tímto názvem již existuje
	if [ -e "$1" ]; then
		# pokud adresář s tímto názvem již existuje
		if [ -d "$1" ]; then
			echo "Adresář s tímto názvem již existuje."
			return 0
		else
			echo "Již existuje soubor se stejným názvem." >&2
			return 1
		fi
	else
		# vytvoříme adresář, protože soubor ani adresář s daným názvem neexistuje
		if mkdir -p "$1"; then
			echo "Adresář byl úspěšně vytvořen."
			return 0
		else
			echo "Adresář se nepodařilo vytvořit." >&2
			return 1
		fi
	fi
}

read

link

read je šikovný nástroj, který slouží k načtení jednoho řádku ze standardního vstupu do dané proměnné (či více proměnných).

Když vyžadujeme od uživatele nějaký vstup za běhu programu, můžeme read použít následovně:

echo -n "Jak se jmenuješ? "
read NAME
echo "Právě jsi mi prozradil, že se jmenuješ ${NAME}."

read má jediný přepínač, a sice -r, který slouží k nastavení toho, jak se má nakládat s výskytem znaku „\“ (zpětné lomítko). Bez něj je považován za escapující znak, přičemž s ním je brán doslova jako znak „\“.

Často se ve skriptech používá ke zpracování textového souboru řádek po řádku, pomocí cyklu while. Následuje ukázka v Bashi, která očísluje řádky daného souboru.

x="$IFS"
IFS=""
n=0
while read -r line; do
	echo "$((++n)) $line"
done < soubor.txt
IFS="$x"

Je možné načítat i do více proměnných najednou:

$ read a b
acko becko
$ echo $b :: $a
becko :: acko

Znak, podle kterého se daný řetězec rozdělí na několik částí, je dán proměnnou IFS, jak je naznačeno výše. Výchozí hodnota této proměnné jsou speciální znaky tab, mezera a nový řádek. Pokud je proměnná IFS nastavená na prázdnou hodnotu (pomocí IFS=""), k žádnému rozdělení nedojde.

       

Hodnocení: 100 %

        špatnédobré        

Nástroje: Tisk bez diskuse

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

9.7.2010 00:44 Pavel
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Me oblibene...
 cat neco | while read line; ...
9.7.2010 02:05 Ash | skóre: 51
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Ta varianta uvedená v článku má vůči této jisté objektivní výhody.
9.7.2010 09:13 vlk
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Radsej takto :
    <neco while read line; ...
9.7.2010 10:18 Pavel
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Dost casto potrebuju mezi tim catem a while neco grepovat, takze zobak je hezky, ale malo platny...
9.7.2010 12:30 Mti. | skóre: 29 | blog: Mti
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Oboji ma svoje. Ta roura Ti zase z toho while nepusti ven promenne... alespon ne naprimo.
Vidim harddisk mrzuty, jehoz hlava plotny se dotyka...
9.7.2010 12:51 Ash | skóre: 51
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
V Bashi lze i <(grep foo soubor.txt) což spojuje oboje výhody do jednoho. Ale to jen doplňuji, nic proti cat sem | tam.
10.7.2010 04:10 zulu
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
A to takhle nemůžeš?
10.7.2010 04:12 zulu
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Beru zpět, špatně jsem si to vyložil.
10.7.2010 04:07 zulu
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
A to funguje kde?
10.7.2010 23:41 plk
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
co kde kdy jak proc?
11.7.2010 04:55 zulu
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
<neco while
11.7.2010 14:26 Ash | skóre: 51
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Předpokládám že v sh, bash, zsh, csh, tcsh, máte nějaké podezření že to někde nefunguje?
11.7.2010 20:01 Jirka P
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Takhle to nefunguje nikde, ono totiž aby shell poznal (podle gramatiky) cyklus, musí být to rezervované slovo první. Nefunguje to minimálně v bashi a v dashi (co jsem teď vyzkoušel).

Podle posixové gramatiky navíc

<neco while x

znamená spuštění příkazu "while" (existuje-li někde na disku) s parametrem x a vstupem přesměrovaným z neco.
11.7.2010 20:56 Ash | skóre: 51
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
No jak jsem říkal, ta varianta popisovaná v článku má své výhody. Máte pravdu, nevím kam na tohle vlk šel, možná v tom zsh. Osobně používám to co je v článku.
9.7.2010 02:03 Ash | skóre: 51
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
read má jediný přepínač, a sice -r

Běžné jsou i ready (asi ne POSIX?) co mají ještě -p.
read -p "Jak se jmenuješ? " NAME
13.7.2010 17:41 pht | skóre: 49 | blog: pht
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]
(bash)
In Ada the typical infinite loop would normally be terminated by detonation.
13.7.2010 20:24 Ash | skóre: 51
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Dobré :)
13.7.2010 17:43 pht | skóre: 49 | blog: pht
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
K basename a dirname bych dodal ještě užitečný příkaz readlink.
In Ada the typical infinite loop would normally be terminated by detonation.
LennyCZ avatar 22.7.2010 00:06 LennyCZ | skóre: 6 | Brno
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Jak je prosím možné toto (jde o bash)?
lennycz@hugo:~$ IFS=x
lennycz@hugo:~$ read a b
aaaxbbbxcccxddd
lennycz@hugo:~$ echo $a
aaa
lennycz@hugo:~$ echo $b
bbb ccc ddd
lennycz@hugo:~$ 
Čekal bych jedno z tohoto:
  1. $a bude aaa a $b bude bbb, zbytek se zahodí
  2. $a bude aaa a $b bude pole složené z bbb, ccc a ddd, pak by se ale výpis měl objevit jako bbbxcccxddd, protože $IFS je nastaveno na x
Pletu se? (To je řečnická otázka, evidentně ano :-D)

Jinak samozřejmě díky za skvělý seriál :D...
Given a choice between dancing pigs and security, users pick dancing pigs every time. (Dancing pigs problem)
22.7.2010 07:30 petr_p | skóre: 55 | blog: pb
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Bash má vestavěný příkaz help. Prostudujte si výstup příkazu help read. Píše se tam, že do poslední proměnné se uloží zbytek řetězce.
LennyCZ avatar 22.7.2010 16:09 LennyCZ | skóre: 6 | Brno
Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
Díky za vysvětlení, o příkazu help jsem nevěděl.
Given a choice between dancing pigs and security, users pick dancing pigs every time. (Dancing pigs problem)

Založit nové vláknoNahoru

ISSN 1214-1267   Powered by Hosting 90 Server hosting
© 1999-2011 Argonit s. r. o. Všechna práva vyhrazena.