MadmanCZ | 4 Apr 2012 09:55
Picon
Favicon

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

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#3

MadmanCZ | 4 Apr 2012 09:58
Picon
Favicon

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 :-)

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#4

Kit | 4 Apr 2012 10:06
Picon
Favicon

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í.

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#6

MadmanCZ | 4 Apr 2012 10:26
Picon
Favicon

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?

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#7

Marble | 4 Apr 2012 10:35
Picon
Favicon

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 "$ <at> "; 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.)

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#9

MadmanCZ | 4 Apr 2012 10:44
Picon
Favicon

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 :-)

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#11

Marble | 4 Apr 2012 10:53
Picon
Favicon

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 "$ <at> " | 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.

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#12

MadmanCZ | 4 Apr 2012 11:00
Picon
Favicon

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.

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#14

Marble | 4 Apr 2012 11:09
Picon
Favicon

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 ...

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#16

MadmanCZ | 4 Apr 2012 11:16
Picon
Favicon

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?

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#20

Marble | 4 Apr 2012 11:29
Picon
Favicon

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 "$ <at> ". (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.

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#23

Kit | 4 Apr 2012 11:20
Picon
Favicon

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
"$ <at> "|dalsi_zpracovani

Zobrazit: http://www.abclinuxu.cz/poradna/programovani/show/357263#21


Gmane