abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 17:11 | Nová verze

    Byl vydán Nextcloud Hub 8. Představení novinek tohoto open source cloudového řešení také na YouTube. Vypíchnout lze Nextcloud AI Assistant 2.0.

    Ladislav Hagara | Komentářů: 0
    dnes 13:33 | Nová verze

    Vyšlo Pharo 12.0, programovací jazyk a vývojové prostředí s řadou pokročilých vlastností. Krom tradiční nadílky oprav přináší nový systém správy ladících bodů, nový způsob definice tříd, prostor pro objekty, které nemusí procházet GC a mnoho dalšího.

    Pavel Křivánek | Komentářů: 5
    dnes 04:55 | Zajímavý software

    Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.

    Ladislav Hagara | Komentářů: 32
    včera 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 13
    včera 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 2
    včera 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    včera 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    včera 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (74%)
     (9%)
     (2%)
     (16%)
    Celkem 805 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

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

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

    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: 53
    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: 31 | 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: 53
    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: 53
    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: 53
    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: 53
    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: 48 | 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: 53
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Dobré :)
    13.7.2010 17:43 pht | skóre: 48 | 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: 8 | 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: 59 | 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: 8 | 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   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.