Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: 3.14.TR 11 Června 2013, 16:44:00

Název: for cyklus [VYŘEŠENO]
Přispěvatel: 3.14.TR 11 Června 2013, 16:44:00
ahoj ahoj,
prosím o radu, podle všech možných tutoriálů by měl následující kód napsal na každou řádku jeden soubor/složku v kořeni
Kód: [Vybrat]
for file in "/*"; do
echo "$file"
done
nicméně můj výstup v konzoli je jednořádkový
Kód: [Vybrat]
/bin /boot /cdrom /dev /etc /home /initrd.img /initrd.img.old /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /selinux /srv /sys /tmp /usr /var /vmlinuz /vmlinuz.old protože se do proměnné $file uloží celý tenhle string najednou (důkaz tady)
Kód: [Vybrat]
for file in "/*"; do
echo "$file"
break
done
tím celý for ztrácí smysl, potřebuju postupně přistupovat k jednotlivým souborům
nefunguje ani z terminálu ani ze skriptu, ovšem na Gentoo a FreeBSD to jde

Mám počeštěné Ubuntu 12.10
Díky moc za rady
Název: Re:for cyklus
Přispěvatel: beer 11 Června 2013, 17:14:55
co nějak takto:

Kód: [Vybrat]
find *|while read line; do něco "$line"; done
Název: Re:for cyklus
Přispěvatel: Vojtěch Trefný 11 Června 2013, 17:17:06
Kód: [Vybrat]
for file in `ls /` ;do echo $file ;done
Název: Re:for cyklus
Přispěvatel: 3.14.TR 11 Června 2013, 18:44:05
co nějak takto:

Kód: [Vybrat]
find *|while read line; do něco "$line"; done
ano ano, díky, to funguje :) díky

Kód: [Vybrat]
for file in `ls /` ;do echo $file ;done
ls se snažím vyhnout - resp ho nahradit tímhle programem (nesmějte se mi, je to do školy)

otázkou zůstává, proč nefunguje ten cyklus standartně, jako kdekoli jinde (viz výše zmíněné systémy nebo můj notebook se stejnou verzí Ubuntu)

každopádně díky za tipy :)
Název: Re:for cyklus
Přispěvatel: GdH 11 Června 2013, 19:53:12
otázkou zůstává, proč nefunguje ten cyklus standartně, jako kdekoli jinde (viz výše zmíněné systémy nebo můj notebook se stejnou verzí Ubuntu)

Nesmíš dát ten regulární výraz do uvozovek. Ve tvém případě sice k expanzi dojde, ale vytvoří se jen jeden řádek, cyklus bude mít je jeden průchod.

Edit: Nečetl jsem to poprvé pořádně, takže druhou větu jsem psal zbytečně :)
Název: Re:for cyklus
Přispěvatel: 3.14.TR 11 Června 2013, 19:58:19
otázkou zůstává, proč nefunguje ten cyklus standartně, jako kdekoli jinde (viz výše zmíněné systémy nebo můj notebook se stejnou verzí Ubuntu)

Nesmíš dát ten regulární výraz do uvozovek. Ve tvém případě sice k expanzi dojde, ale vytvoří se jen jeden řádek, cyklus bude mít je jeden průchod.

Edit: Nečetl jsem to poprvé pořádně, takže druhou větu jsem psal zbytečně :)

jéééé, díky, moje blbost, je to jasné... ale pořád nechápu, že to na notebooku funguje (a na Gentoo taky)
Název: Re:for cyklus
Přispěvatel: GdH 11 Června 2013, 20:04:27
... ale pořád nechápu, že to na notebooku funguje (a na Gentoo taky)

Troufal bych si říct, že ani tam ne ;)
Název: Re:for cyklus
Přispěvatel: 3.14.TR 11 Června 2013, 20:13:20
... ale pořád nechápu, že to na notebooku funguje (a na Gentoo taky)

Troufal bych si říct, že ani tam ne ;)

ale jo, mám ssh do školy...
Název: Re:for cyklus [VYŘEŠENO]
Přispěvatel: pacholik 11 Června 2013, 21:24:08
Řek bych že jádro pudla bude v těch uvozovkách. Ale i tak mi to vrtá hlavou, protože "/*" mi všude expanduje prostě na /*.
Název: Re:for cyklus [VYŘEŠENO]
Přispěvatel: ntz_reloaded 11 Června 2013, 21:37:09
http://mywiki.wooledge.org/BashPitfalls#pf1