Portál AbcLinuxu, 5. května 2025 14:40

Dotaz: while

23.3.2016 20:05 Jan
while
Přečteno: 1397×
Odpovědět | Admin
Dobrý den, mám menší problém s tímto kódem:

FILES="" a=0

ls -l | while read radek; do

FILES[$i]="$radek" (i=i+1)

done

Jde mi o to, že po skončení cyklu v poli FILES není žádná hodnota. Někde jsem se dočetl, že při použití roury "|" se za done jsou hodnoty zapomenuty, ale já bych chtěl nadále s obsahem v poli FILES pracovat. Děkuji za všechny odpovědi.

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.3.2016 20:34 Jan
Rozbalit Rozbalit vše Re: while
Odpovědět | | Sbalit | Link | Blokovat | Admin
Samozřejmě u té inkrementace měli být dvě závorky:

FILES=""

i=0

ls -l | while read radek; do

FILES[$i]=$radek

((i=i+1))

done

23.3.2016 20:43 Skokan | skóre: 11
Rozbalit Rozbalit vše Re: while
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj, Podle návodu zde by to mělo jít udělat tímto příkazem
#!/bin/bash 
filecontent=( `ls -l`)
23.3.2016 20:46 Skokan | skóre: 11
Rozbalit Rozbalit vše Re: while
Jak kopíruju, zapomněl jsem přejmenovat proměnnou.
#!/bin/bash 
FILES=( `ls -l`)
23.3.2016 20:48 Jan
Rozbalit Rozbalit vše Re: while
Děkuji za rychlou odpověď, ale tohle mi podle všeho uloží každé slovo do jedné buňky, ale já potřebuji aby tam uložil celý řádek kde bude vlastně celá informace o souboru či adresáři.
wamba avatar 23.3.2016 21:22 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: while
asi stačí změnit IFS
IFS="           
" FILE=(`ls -l`)
ale proč to chcete do toho Array dostat? bash je nejsilnější právě při práci s řádky pomocí rour a poněkud neohrabaný při práci s Array
This would have been so hard to fix when you don't know that there is in fact an easy fix.
23.3.2016 21:40 Jan
Rozbalit Rozbalit vše Re: while
Můj problém je v tom, že potřebuji nejdříve uložit všechny data a teprve pak s nimi můžu pracovat.
Řešení 2× (mimi.vx, 1john2)
23.3.2016 21:23 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: while
Odpovědět | | Sbalit | Link | Blokovat | Admin

Klasický chyták, při použití roury se celý while cyklus provádí v samostatném subshellu, který se v mnoha ohledech snaží chovat, jako by to tak nebylo, ale něco prostě zakrýt nejde. Jedním z toho je skutečnost, že ten subshell má vlastní environment a není tedy schopen měnit proměnné hlavního shellu.

Jednou z možností je (bash only) použít process substitution:

i=0
while read; do
    FILES[$[i++]]="$REPLY"
done < <(ls -l)

(další chyták je, že na rozdíl od read bez parametru příkaz "read radek" odstraní počáteční a koncové mezery, což nemusí být vždy žádoucí (někdy se to ale naopak hodí).

23.3.2016 21:38 Jan
Rozbalit Rozbalit vše Re: while
Děkuji za přesné vysvětlení mého problému a také děkuji za řešení.

Založit nové vláknoNahoru

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

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.