abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 16:11 | Komunita

Byly zveřejněny videozáznamy přednášek a workshopů z letošní konference OpenAlt konané 4. a 5. listopadu v Brně. K videozáznamům lze přistupovat ze stránky na SuperLectures nebo přes program konference, detaily o vybrané přednášce nebo workshopu a dále kliknutím na ikonku filmového pásu.

Ladislav Hagara | Komentářů: 0
dnes 14:11 | Komunita

Některým uživatelům Firefoxu se tento týden do Firefoxu nainstalovalo neznámé rozšíření Looking Glass 1.0.3 (png). Ve fórů Mozilly se řešilo, zda se nejedná o malware. Mozilla později informovala, že se jednalo o reklamu na seriál Mr. Robot. Řadě uživatelů Firefoxu se jednání Mozilly vůbec nelíbilo. Mozilla proto automatickou instalaci doplňku ukončila [Hacker News, reddit].

Ladislav Hagara | Komentářů: 9
včera 12:00 | Nová verze

Po cca 3 týdnech od vydání Linux Mintu 18.3 s kódovým jménem Sylvia a prostředími MATE a Cinnamon byla oznámena také vydání s prostředími KDE a Xfce. Podrobnosti v poznámkách k vydání (KDE, Xfce) a v přehledech novinek s náhledy (KDE, Xfce). Linux Mint 18.3 je podporován do roku 2021.

Ladislav Hagara | Komentářů: 6
15.12. 12:55 | Nová verze

Byla vydána verze 17.12.0 KDE Aplikací (KDE Applications). Přehled novinek v kompletním seznamu změn a na stránce s dalšími informacemi. Aplikace, které nebyly dosud portovány na KDE Frameworks 5, byly z KDE Aplikací odstraněny.

Ladislav Hagara | Komentářů: 53
15.12. 03:00 | Komunita

Na Humble Bundle lze získat počítačovou hru Company of Heroes 2 (Wikipedie, YouTube) běžící také v Linuxu zdarma. Speciální akce končí v sobotu v 19:00.

Ladislav Hagara | Komentářů: 0
15.12. 02:00 | Zajímavý software

Christian Kellner představil na svém blogu projekt Bolt řešící bezpečnost rozhraní Thunderbolt 3 na Linuxu. Pomocí příkazu boltctl nebo rozšíření GNOME Shellu lze komunikovat s démonem boltd a například zakázat neznámá zařízení a předejít tak útokům typu Thunderstrike nebo DMA.

Ladislav Hagara | Komentářů: 10
15.12. 01:00 | Nová verze

Po půl roce vývoje od vydání verze 11.0 byla vydána verze 11.1 svobodného softwaru pro vytváření datových úložišť na síti FreeNAS (Wikipedie). Nejnovější FreeNAS je postaven na FreeBSD 11.1. Přehled novinek v příspěvku na blogu. Zdůraznit lze zvýšení výkonu OpenZFS, počáteční podporu Dockeru nebo synchronizaci s cloudovými službami Amazon S3 (Simple Storage Services), Backblaze B2 Cloud, Google Cloud a Microsoft Azure

Ladislav Hagara | Komentářů: 0
14.12. 23:55 | Nová verze

Po dvou měsících vývoje od vydání verze 235 oznámil Lennart Poettering vydání verze 236 správce systému a služeb systemd (GitHub, NEWS).

Ladislav Hagara | Komentářů: 10
14.12. 20:00 | Nová verze Ladislav Hagara | Komentářů: 0
14.12. 19:33 | Pozvánky

Pražská Fedora 27 Release Party, oslava nedávného vydání Fedory 27, se uskuteční 19. prosince od 19:00 v prostorách společnosti Etnetera (Jankovcova 1037/49). Na programu budou přednášky o novinkách, diskuse, neřízený networking atd.

Ladislav Hagara | Komentářů: 0
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (8%)
 (0%)
 (1%)
 (1%)
 (75%)
 (14%)
Celkem 1008 hlasů
 Komentářů: 45, poslední 1.12. 19:00
    Rozcestník

    Dotaz: Mezery v názvu souborů

    4.4.2012 09:10 MadmanCZ
    Mezery v názvu souborů
    Přečteno: 850×

    Ahoj, tak jsem tady po krátké době zas. Pokusím se ve stručnosti nastínit svůj problém. Načítám si parametry zadané uživatelem, co parametr to buď metoda pro řazení slov nebo název souboru. Tyto soubory v jednoduchém forcyklu načítám do své proměnné a pak dalším forcyklem zpracovávám výpis těch txt souborů do další proměnné. Jenže problém když uživatel zadá název souboru ve kterém je mezera, nebo i když zadá soubor co se jmenuje (mezera).txt

    for i in `seq 1 $# ;
    do parametry="$parametry $1"
    shift
    done
    

    Takhle si načítám ty jednotlivé parametry zadané uživatelem.

    Pak v dalším forcyklu vypisuji obsah těch souborů , to myslím není klíčové. Problém bude tady.

    Zkoušel jsem tam nějak uplatnit IFS ale to se minulo účinkem :-( Neporadil by někdo?

    Předem děkuji za jakékoliv rady.


    Řešení dotazu:


    Odpovědi

    4.4.2012 09:38 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Já jsem pako, programuji to v Bashi :-)
    4.4.2012 09:48 Kit
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Parametry s mezerou je nutné dávat do uvozovek. A to i uvnitř skriptu.
    4.4.2012 09:55 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    To jsem zkoušel , doplnil jsem úvozovky snad všude kde jsem použil parametry nebo parametry a nepomohlo :-( Proto jsem se začal zaobírat s metodou IFS
    4.4.2012 09:58 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Já se fakt už omlouvám , nevyspání dělá svoje :( Pak dále ty hodnoty parametrů převadím do pole

    PARAMETR=( $PARAMETRY )  když zde doplním úvozovky tak to nepomůže

    Fakt se omlouvám za komplikace ale tohle už je snad všechno ,snad jsem už nic nezapomněl :-)

    4.4.2012 10:06 Kit
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Hlavně si myslím, že to celé děláš úplně nesmyslně. O co se vlastně snažíš? Podle mne to půjde elegantně i bez načítání do pomocných proměnných a bez polí.
    4.4.2012 10:26 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Mám skript který bude počítat četnosti slov a řadit mi ty slova podle zadaných parametrů. Pokud bude zadaný -a tak seřadí abecedně vzestupně, pokud -a -r tak abecedně sestupně, pokud -r tak podle četnosti sestupně, bez těhle parametrů defaultně podle četnosti vzestupně.

    Uživatel tedy zadá například toho: ./Ultrabeta.sh -a -r prvni.txt druhy.txt treti.txt

    Já si uložím do proměnné jestli byl první parametr -a nebo - r , to samé pro druhý parametr. Převedu si všechny ty parametry do proměnné. A pak tu proměnnou předělám na pole , takto nám to myslím radil cvíčící ale nerad bych kecal. A pak si pomocí for cyklu na průchod polem udělám výpis obsahu těch souborů do další proměnné a pak to zpracovávám.

    V průběhu skriptu nesmím nic nikam ukládat, jediné co mám povoleno je načíst si ty soubory a vypsat pak výsledek na standartní výstup.

    Snad jsem to už popsal lépe a bude jasnější o co se pokouším.

    Jak byste to řešil Vy?
    4.4.2012 10:35 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Pokud ti zbývají v parametrech jen názvy souborů (shift znáš :)) a chceš přes ně udělat jen jeden cyklus, tak prostě něco jako for soubor in "$@"; do. For cyklus v bashi je přes "množinu", ne "numerický" jako v C. Tudíž bys měl do něj číselný rozsah generovat pouze tehdy, když to opravdu potřebuješ (což většinou nepotřebuješ) a jinak iterovat přímo přes to, co chceš (názvy souborů atd.).

    Druhá věc je, že podle tvého popisu to vypadá, že všechny soubory z parametrů spojuješ dohromady za sebe. K tomu přeci služí příkaz cat bez jakéhokoliv cyklu.

    Když se nad tím trochu zamyslíš, tak pak můžeš celý další úkol provést v pipe za tím cat. (hint: sort, sort -g, uniq -c a nakonec něco na úpravu výstupu do požadoané podoby -- cut, sed apod.)

    4.4.2012 10:44 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Mno teoreticky by v téhle časti měli zbývat už jen názvy souborů bez řadících parametrů. For cyklus ,že je přes množinu jsem po mnoha desítkách minut googlení taky vykoumal :-D

    Ano všechny soubory spojím do jedné proměnné a pracuji se všemi najednou.

    Ten cat mám v tom dalším forcyklu ,  forcyklus jede do hodnoty o 1 menší než je počet parametrů (jinak to nefungovalo :-) ) a v tom forcyklu je to napsané takto:

    TEXT=$TEXT" ""`(cat ${PARAMETR[$i]} | tr '[:upper:]' '[:lower:]')`"

    V Bashi jsem naprostý nevzdělanec ,tak to možná řeším příliš složitě :-) Program je odhadem tak na 80 řádků zatím :-)

    4.4.2012 10:53 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Hm, unikl ti smysl příkazu cat. :) Slouží ke spojení souborů, ne k vypsání jednoho souboru (OK, je to na dlouhou diskuzi, ale výhledově se zeptej googlu na "useless use of cat" či něco podobného).

    Takový hint na jeden řádek v bashi, co neřeší přepínače, ale jinak se blíží k tomu, co chceš: cat "$@" | sort -u; Nic víc, prostě jen tenhle jeden řádek. :)

    Mimochodem, není úplně rozumné ukládat do proměnných moc dat (celý obsah souboru). Můžeš narazit na různé problémy související s limitem environment size (při spouštění podprocesů apod.), záleží to na platformě, ale obecně je dobré se snažit držet do kB, ono je i z jiných důvodů rozumné používat na velká data roury.

    4.4.2012 11:00 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    S tím catem jsem se spletl :-) Já už se asi zase ztratil... Ten řádek jestli jsem dobře pochopil tak to spojí všechny soubory zadané parametrem a seřadí je to pomocí unique , nebo kecám? :-) Já z těch parametrů potřebuju vyhodit ty parametry pro řazení aby mi to pak nepsalo chybu:

    cat: -a Adresář nebo soubor neexistuje

    cat: -r Adresář nebo soubor neexistuje

    Ale to mi stále neřeší problém s  těma mezerama ne? :-)

    Jinak se mi zdá taky podivné to cpát do proměnné , ale je to tak zadané a musím se tomu přízpusobit, podle mě by bylo lepší mít nějaký můj pomocný txt soubor.

    4.4.2012 11:09 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Přepínače napřed sežereš a vyřadíš přes shift (until $1 je přepínač, zapomatuj a shift). To už bys měl zvládnout sám. (Případně se podívej na 'getopt', ale to je linux-specific a trochu přehnané na tenhle účel.)

    Smysl mojí ukázky jsi pochopil, mezery to řeší, ale samozřejmě musíš názvy při volání správně zadat. To je principiální, rozlišit co je a co není oddělovač musí volající. (viz můj komentář ve vedlejším threadu)

    Ad proměnná -- já to také myslel tak, že nepotřebuješ ani soubor. Tohle by mělo jít vyřešit v rámci pipe. Pomocné soubory mají své záludnosti a pokud se jim dá vyhnout ...
    4.4.2012 11:16 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    To vyřazení těch přepínačů jsem řešil takto:

    for i in `seq 1 $#` ; do

    PARAMETR="PARAMETRY $1"

    shift

    done

     

    PARAMETRY=${PARAMETRY#*-r}

    PARAMETRY=${PARAMETRY#*-a}

    Mohu to tady řešit stejně? Nebo na to budu muset jít jinak?

    4.4.2012 11:29 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Děláš ze všech parametrů jeden string, ve kterém ztratíš rozlišení mezery a oddělovače. Tudíž nemůžeš. (Resp. ne natolik jednoduše, aby to za to stálo.)

    Ale vzhledem k tomu, že píšeš, že parametry mohou být jen na začátku, tak přeci není důvod načítat všechny parametry. Prostě zavolej shift právě jentolikrát, aby $1 už nebyl přepínač, tot vše. Máš i while cyklus, nejen for. Parametry, co jsou názvy souborů nech pěkně odpočívat tam, kde jsou a můžeš je jednoduše použít přes "$@". (Ano, podobně se dá využít i pole, ale skutečně tu k tomu není žádný důvod.)

    Getopt je na tohle IMO zbytečné (zbytečná závislost navíc a na zpracování dvou přepínačů prakticky žádný zisk). Ale je dobré vědt, že existuje.
    4.4.2012 11:20 Kit
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Tak nejdřív bych se podíval, co dělá příkaz getopts, zpracoval parametry a odstranil pomocí shiftu. Z příkazové řádky zbude jen seznam souborů, stačí tedy cat "$@"|dalsi_zpracovani
    4.4.2012 10:06 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Máš nějaký důvod, dělat nejprv ze všech parametrů jeden string a pak jej zpátky sekat do pole? Asi by šlo whitespace nějak pořešit i takhle, ale bude to úděsný opruz.

    Pokud chceš dostat všechny parametry z cmdline do pole, stačí ti v bashi úplně jednoduchá řádka: pole=("$@");

    4.4.2012 10:33 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Tak jsem to vyzkoušel a pokud jsem to udělal správně tak se mi načetl pouze první parametr.
    4.4.2012 10:42 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Zkus poslat ukázku, co ti nefunguje. Tohle fuguje:

    # cat pokus.sh
    #!/bin/bash
    a=("$@")
    echo "Parametry: ${a[0]} -- ${a[1]} -- ${a[2]}"
    
    # ./pokus.sh prvni "druhy s mezerou" tre\ ti ctvrty
    Parametry: prvni -- druhy s mezerou -- tr eti
    
    4.4.2012 10:54 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Tak jsem to opsal stejně jako Vy, a funguje to, ale zůstal problém s mezerou. Když tam zkusím cvičně zadat například soubor s mezerou.txt tak mi ho to rozseká na:

    soubor

    s

    mezerou

    4.4.2012 11:01 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    A při volání toho scriptu máš ten název v uvozovkách? Tak jako v mojí ukázce?

    Při spouštění programu většinou nebývá implementována křištálová koule a tudíž musí ten, kdo jej spouští dát najevo, co je separátor, a co mezera patřící do parametru. Tudíž parametry obsahující mezeru (které ale mají zůstat jedním parametrem) je třeba psát budto do uvozovek anebo před mezeru, která není oddělovačem přidat backslash.

    To je při volání scriptu. Druhá věc je nerozbít to rozdělení uvnitř. Na to se silně hodí právě konstrukce "$@" která expanduje na "$1" "$2" ... "$x" (viz man bash).

    P.S. prosím nevykat. :)
    4.4.2012 11:11 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Dobře , já nikdy v odborných diskuzích na úrovni nevím jestli vykat nebo tykat :-)

    Jak při volání scriptu v úvozovkách? Script volám takto: ./Ultrabeta.sh Pokus.txt Soubor s mezerou.txt

    Vím ,že je asi prasárna to zadávat takto ,ale pokud se nemyslím tak na takovémhle příkladu to chtějí testovat v automatickém odevzdávacím systému.

    4.4.2012 11:11 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    *pokud se nemýlím
    4.4.2012 11:15 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Tady nejde o prasárnu, ale o princip. Pokud předáváš parametr s mezerami, musí to ošetřit volající. (Ošetřit = označit co je oddělovač a co významová mezera.) Volaný k tomu přeci nemá dost informací. Co kdyby existovaly tři soubory: a, b, a<mezera>b. Jak bys chtěl určit, jestli volající myslí první dva anebo třetí?

    Proto se to řeší budto uvozovkami kolem parametru anebo backslash. Zkus si, co ti třeba v bashi doplní tabulátor. Uvidíš, že ti mezeru automaticky escapuje backslashem. Tohle musí dělat i testovací systém.
    4.4.2012 11:24 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Dobře takže pokud volající (já jsem volaný, že jo? :-D ) ošetří co je mezera oddělovací a co mezera významová tak by to s těma úvozovkama mělo jet?
    4.4.2012 11:32 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Přesně tak, volaný je tvůj script. Bude to fungovat dokud si rozlišení mezer nerozbiješ uvnitř scriptu něčím jako for soubor in $*; do anebo řetězením do jednoho stringu.
    4.4.2012 19:00 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Tak jsem se dostal ke svému linuxovému stroji a zkouším dál :-) tak už snad umím zpracovat mezeru.

    Ale dostal jsem se do problému s odstraněním těch přepínačů nebo jak se tomu správně nadává.

    chtěl jsem to řešit pomocí dvou if cyklů ve smyslu ,že pokud je v 1.parametru -a nebo -r  tak smaž první pozici pole,  druhý if pokud je 2.parametr -a nebo -r tak smaž druhou pozici pole...

    Dělal jsem to pomocí unset ${a[0]}  tuto syntaxi jsem našel na internetu.... Manuálová stránka pro to není.

    Je moje myšlenka správná? Nebo nedělat pomocí unsetu a ifů ?:-)

    4.4.2012 19:19 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Uf, nevím co je "if cyklus", ale nejprv ten unset ...

    1) Co je zač proměnná $a, resp. kde ji bereš? Potřebuješ přeci pracovat s parametry scriptu, ne? Správný příkaz pro "smazání" předaného parametru už v téhle diskuzi padnul mockrát, i od tebe. 2) to, co píšeš vzdáleně připomíná vymazání prvku pole, ale potom ti tam přebývá ${} (doporučuji raději číst man bash anebo podobnou oficiální dokumentaci, než hledat náhodné výkřiky na netu). Nicméně pole tam nikde nemáš důvod mít, ne?

    Ke zbytku, aneb algoritmus -- po smazání prvního parametru (přepínače) se přeci dostaneš zpět ke stejné původní otázce "je prvním parametr přepínač?", takže není potřeba dělat podmínku na čtyři kombinace parametr-pozice, ale jen na dva parametry v cyklu stále na první pozici. Tady to není extra velký rozdíl, ale programujme slušně (představ si těch parametrů trochu víc).
    4.4.2012 19:39 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    a=("$@")
    echo "Parametry: ${a[0]} -- ${a[1]} -- ${a[2]} -- ${a[3]} -- ${a[4]} -- ${a[5]}"

    if [ "$1" = '-a' ] | [ "$1" = 'r'] ; then
    unset ${a[0]}            

    fi

    if [ "$2" = '-a' ] | [ "$2" = 'r'] ; then
    unset ${a[1]}    
    fi

    echo "Parametry: ${a[0]} -- ${a[1]} -- ${a[2]} -- ${a[3]} -- ${a[4]} -- ${a[5]}"

     

    Prostě IF (asi ne if cyklus). Myslel jsem že takto to bude nejjednodušší, to pole parametrů jsem použil jak radil kolega výše.  Nebo jsem ho špatně pochopil?

    :-) Ale asi jsem nedomyslel, že to možná povede k chybě :-(

    Manuálové stránky se snažím používat, ale třeba pro příkaz unset tam není vůbec nic :-(

     

    4.4.2012 19:49 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    man bash, hledej sekci Arrays, na jejím konci máš i příslušný unset.

    O poli jsem ti psal já, ale jak jsi postupně odhaloval své záměry že potřebuješ jen obsah předaných souborů, tak pole používáš úplně zbytečně. Jako jo, to co píšeš bude po pár úpravách nějak fungovat, ale nedává smysl duplikovat parametry do pole, když jej k ničemu víc nevyužiješ (a ještě si tím věci komplikuješ).

    K tomu tvému -- unset viz můj minulý příspěvek, "or" je dvojité svislítko, jednoduché je pipe. Jo, a možná bys před smazáním těch přepínačů rád nějak uchoval fakt, že byly předány. :)
    4.4.2012 19:57 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Tak teď jsem se do toho zamotal úplně :-D To s tím orem moje blbost :( Jsem vůl... jedna čárka a jak to je všechno v řiti :D

    Já nevím jak zpracovat ty parametry abych z nich odstranil přepínače, proto jsem je cpal do stringu nebo teď nově do pole. V tom poli to pracuje podstatně lépe .

    Jinak ten Array pročítám ale je to nějaké komplikované. To s těma přepínačema mám ošetřený v minulém skriptu, normálně si jejich hodnotu uložím do proměnné abych k nim mohl nezávisle přistupovat. Jak teda ideálně poznat přepínač a jak ho ideálně odstranit když ne pole? Mě už nic nenapadá :-)
    4.4.2012 20:05 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Vykašlat se na pole znamená něco jako: Dokud $1 obsahuje přepínač, tak shift (zároven je to vhodná chvíle na nastavení příznaku existence toho přepínače do nějaké proměnné). No a potom už jsou prostřednictvím "$@" přichystané parametry pro cat.

    Nicméně po vyřešení těch dvou drobností (a poté, co si najdeš syntax zajištující ekvivalent expanze "$@" pro pole, abys zas nebojoval s mezerami) budeš mít fungující i postup s polem.

    Já se tu snažím nadhazovat postup, který mi přijde (nakolik chápu tvůj cíl) jako rozumně jednoduchý, efektivní a elegantní. Což neznamená, že to nepůjde řešit i jinak.
    4.4.2012 20:10 Kit
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Jaký ekvivalent expanze "$@"? Jednoduše udělá tohle:
    cat "$@"
    a tím se všechny soubory spojí a dají se přesměrovat kamkoli. Už jsem to tady psal.
    4.4.2012 20:16 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    If trvá na použití pole, tak ne. Jasně, já vím že to jde jednodušeji, přečti si co píšu: "pokud chceš za každou cenu použít pole, půjde to také, ale potřebuješ ještě tohle ..." Netvrdím, že pole je vhodná, natož optimální, cesta.
    4.4.2012 20:18 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Na okraj: cat "$@" tu padlo poprvé ode mne. :)
    4.4.2012 20:25 Kit
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    No jo, nějak jsem to přehlédl. Ale o to pádnější důvod, aby to použil.
    4.4.2012 20:31 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Hlavně se mi tu nehádejte :-D Cat samozřejmě používám :-) Jenže trochu blbě než bych potřeboval. Teď jen řeším optimální načtení parametrů. A motám se do toho čím dál víc. Pokud vyřeším tohle tak s Catem by neměl být problém.
    4.4.2012 20:19 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    "$@" tohle mi v pohodě bere snad i mezery :-) Ale furt nechápu jak myslíš ten while.

    Kam si to budu ukládat nebo jak to pak zpracuji?

    while ["$@" = "-#"]

    do  a=("$@")

    shift

    done

    nebo na to jdu úplně špatně? Já nevím jak si asi vyjádřít jestli jsem ještě u přepínače nebo už u názvu .

    4.4.2012 20:32 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Ad funkčnost "$@" -- pokud si odmažeš přepínače z pole, tak v expanzi "$@" ti ale samozřejmě zůstanou.

    Ad bez pole: Když bez pole, tak bez pole, tudíž žádné a=, to na začátek. Test jde udělat různě, v bashi můžeš využít něco jako následující:

    while [ "$#" -gt 0 ] && [ "${1:0:1}" = "-" ]; do
    ... tady si nastav proměnné podle celé hodnoty $1 ...
    shift
    done
    

    Tím ti zmizí parametry začínající pomlčkou a "$@" se expanduje jen na zbylé (tj. požadované názvy souborů). Přesný význam podmínky najdeš pomocí man test (první část) a sekce "Parameter Expansion" z man bash (druhá část). Případně si zkus něco jako x=-r; echo ${x:0:1};

    4.4.2012 20:39 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Případ, kdy ti po odmazání přepínačů nezbudou žádné další parametry asi budeš chtít řešit speciálně, protože volání cat bez parametrů ti skončí viset na čtení ze stdin, což asi nechceš. Takže test $# budeš chtít pravděpodobně ještě jednou po smyčce. (Teda, dá se také něco jako </dev/null cat "$@" | ..., ale to také záleží na tom, jakou chceš reakci scriptu na prázdný seznam souborů.)
    4.4.2012 20:40 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Tohle je už na mě vyšší škola programátorská :-)

    Ten while obsahuje ty metody getopts co jsme nechtěli používat ne?

    Co myslíš tím řádkem ...tady si nastav proměnné .... To jako ,že uložím první přepínač do jedný proměnný a druhý přepínač do druhý proměnný?

    Nebylo by jednoduší pole ikdyž by to byla trochu čuňárna ? :-)

    4.4.2012 20:56 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Člověče, to jsou základy! Co dělá while doufám chápeš. Dvě podmínky jsou spojené přes and (&&). První testuje hodnotu proměnné $# (najdi si v man bash, co ta proměnná obsahuje), druhá testuje první znak prvního parametru (detaily opět v manu). Dokud jsou opě splněné volá se shift, který smaže parametr $1 a $2..$n posune o jednu pozici dopředu (detaily viz man).

    getopt slouží ke zjednodušení zpracování složitějšího seznamu přepínačů, popravdě využití má spíš v C, v bashi a speciálně pro tenhle případ by ti s getopt vyšel kód spíš složitější.

    Nastavit si proměnné: no na základě existence těch přepínačů v parametrech musíš někde dál větvit chování programu, ne? A to větvení je něčím řízeno ( if [ "$raditciselne" = "ano" ]; then ...), ne? Proměnnou ... ? :)

    S polem nic jednoduššího mít nebudeš. To fakt není o tom, že by to byla čuňárna. (Čuňára je volat v cyklu cat abys tím spojil řadu souborů! Spouštění podprocesu je relativně drahá operace.) Prostě použít pole je v tomhle případě hodně proti logice shellu (shell prostě není Cčko) a z toho plyne, že kód s jeho použitím bude složitější.

    4.4.2012 21:10 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Když já už se do toho úplně zamotal :-( While chápu. Proměnné si nastavím , to taky zvládnu ale jak udělat ty přepínače :(

    Jinak když to zadám bez přepínáčů tak to snad jede taky ale ještě to musím pořadné otestovat.

    #!/bin/bash



    a=("$@")
    #echo "Parametry: ${a[0]} -- ${a[1]} -- $(a{0]} -- ${a[0]}"
    echo "Parametry: ${a[0]} -- ${a[1]} -- ${a[2]} -- ${a[3]} -- ${a[4]} -- ${a[5]}"

    while [ "$#" -gt 0 ] && [ "${1:0:1}" = "-" ]; do
    "$@"
    shift
    done
    echo "$@"

     

    Tahle syntaxe mi odstraní přepínače ,ale zároveň to hlásí,že příkaz -a nebyl nalezen a to samé pro -r .

    Já vím,že už musím vypadat jak idiot, ale Bash je pro mě stále jedna velká záhada. :-)

    4.4.2012 21:22 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    No, co máš po "do"? Je tam řádek, co začíná "$@", to znamená provede se expanze a první token se vezme jako název příkazu ke spuštění. No a ten první token bude nejprv první parametr, pak druhý, ... Tudíž proto ta chyba. Ty ho ale nechceš spouštět, ne? Chceš jen zjistit, co je obsahem $1. Na to se docela hodí case. Detaily opět v manuálu. Ukázka:

    while ...; do
      case "$1" in
        -r) echo "zadán přepínač -r"
          ;;
        -a) echo "zadán přepínač -a"
          ;;
      esac
      shift
    done
    

    Mimochodem, pomocí case se dá také poměrně elegantně vyhnout bash-specific substringové konstrukci ${1:0:1}. Zkus si rozmyslet jak. (Nápověda: case v bashi umí mít label s wildcards). Ale to není nijak podstatné tedka.

    4.4.2012 21:37 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Tak jsem se zas o píď pohnul dál :-)


    while [ "$#" -gt 0 ] && [ "${1:0:1}" = "-" ]; do
    case "$1" in
    -r) echo "zadán přepínač -r"
    ;;
    -a) echo "zadán přepínač -a"
    ;;
    -v) echo "5"
    exit "0"
    ;;
    esac
    shift
    done

    echo "$@"


    TEXT=$TEXT" ""`(cat "$@" | tr '[:upper:]' '[:lower:]')`"
    echo $TEXT


    SLOVA=`(echo $TEXT | sed 's/[^a-zA-Z]/ /g')`
    SLOVA=`(echo $SLOVA | tr '[:space:]' '\n')`

    echo $SLOVA

    Tohle mi už vypíše všechna slova zadaná ze souborů , nevyhodí to už žádnou chybu. Zpracuje to i soubory co jsou zadané jen jako mezera. Ale zase jsem sekl o kousek dál :-D  Tohle mě už fakt zničí :-D Chci si to uložit do proměnné  TEXT a pak upravit  na SLOVA,  jenže v téhle části se to sekne ikdyž mi to v původním programu funguje.

    TEXT a SLOVA jsou po provedení echo úplně totožné. SLOVA by měla být rozsekaná jednotlivá slova na jednotlivé řádky. Ale už se blížím k finále :-)

    4.4.2012 21:39 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Tak jsem debil , fakt debil , úplnej debil. Já tam nedal úvozovky :-D

    Samozřejmě tam má být ještě -e to se mi nějak nezkopírovalo ale úvozovky ještě k tomu uááá, je tooo :D děkuju moc :-)
    4.4.2012 21:54 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    Můžu ještě rejpat? :)

    1. Závorky uvnitř zpětných apostrofů nejsou potřeba a naopak "škodí", protože se tím spouší další podporces. (pokud se ti líbí závodky, použij syntax $(...) místo `...`)
    2. Pipeline může obsahovat neomezený počet příkazů, ne jen dva. Tudíž můžeš vše dát do jedné pipeline.
    3. Pokud se můžeš vyhnout (a jsem si téměř jistý, že můžeš) ukládání více než několika kB do proměnných, udělej to. Prostor pro environment je platformě závislý, ale rozumnou jistotou jsou jen nějaké malé (desítky?) kB, a při překročení se mohou dít divné věci.
    4. Předpokládám, že cílem toho boje s mezerami a newline není apriori rozdělit dvojslovný řádek na dva, ale jen "vyřešit", že ti echo "sežralo" newlines. Mám pravdu? V prvním přiblížení to řeší echo "$TEXT" (uvozovky), v druhém přiblížení jedna dlouhá pipeline bez meziukládání do proměnných.
    4.4.2012 21:59 MadmanCZ
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    1. Závorky opraveny, já je tam měl protože, mi to v jedné fázi bez nich nejelo, ale smazáno :-)

    2. Pipeline jsem plánoval nějak ukecat a vměstnat do jednoho řádku ,ale zatím jsem se bál :-D

    3. Jak to myslíš s tím ukládáním? Nemůžu to uložit nikam do externího souboru

    4. Cílem tohoto boje je rozdělit si to na jednotlivá slova na řádek abych pak mohl spočítat jejich četnost, uniq jede po řádcích pokud si to pamatuji dobře.

    A teď jeden zvídavej dotaz ode mně (mno teda jeden z mnoha) to Švédsko za jménem znamená, že jsi ze Švédska? :-)

    4.4.2012 22:14 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů

    ad 3. No myslím to tak, že až se ti povede vše sepsat do jedné pipeline, tak to prostě rovnou proběhne na výstup a nebude důvod nic ukládat ani do proměnné ani do pomocného souboru. Alespoň pokud mi neuniká nějaký další účel.

    ad 4. Jasně, mě šlo o to, jestli v původních vstupních souborech může být víc slov na řádek, která je cílem oddělit. Pokud jo, tak OK. Pokud ne, tak je nahrazování mezer za newline zbytečné a je lépe ty konce řádků rovnou zachovat. Sort, uniq a spol skutečně fungují po řádcích, to máš pravdu.

    (Ad Švédsko -- znamená, že jsem ve Švédsku. :) Příp. offtopic k tomu ale kdyžtak přes mail -- klik na profil, poslat mail; ať tu nezaprasujem diskuzi.)

    4.4.2012 21:08 Marble | skóre: 27 | blog: marble | Švédsko
    Rozbalit Rozbalit vše Re: Mezery v názvu souborů
    Ještě k poli: pokud máš pocit, že je ti to nějak bližší, klidně si zkus napsat kód s polem. Jak říkám, je možné takhle napsat funkční. Pokud se ti to povede, tak pak už bys z něj měl vidět, že tam to pole používáš vlastně zbytečně a můžeš jej vyházet. :)

    Založit nové vláknoNahoru

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

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.