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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 3
dnes 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 4
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 9
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 24
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 4
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 1
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 771 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Mezery v názvu souborů

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

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.