Portál AbcLinuxu, 14. května 2025 23:09

Dotaz: Problém s načítáním souboru

5.11.2012 21:12 VI5
Problém s načítáním souboru
Přečteno: 322×
Odpovědět | Admin
Hoj, snažím se načíst jednotlivé řádky ze souboru a uložit je do pole. Ať dělám co dělám, echo vypisuje stále 0. Nevidí někdo problém? Díky
#!/bin/bash

ARR=()

cat /def/$FILE | while read LINE
do
 ARR+=("$LINE")
done

echo ${#ARR[*]} 
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

5.11.2012 21:47 l4m4
Rozbalit Rozbalit vše Re: Problém s načítáním souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Roura vytváří subshell, po jehož skončení samozřejmě zmizí i proměnná. Lze použít pouze přesměrování, nikoli rouru.
5.11.2012 23:50 Delaunay | skóre: 17 | blog:
Rozbalit Rozbalit vše Re: Problém s načítáním souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je třeba vyhnout se opakovanému spouštění subshellu a jak píše l4m4 - použít přesměrování.
while read LINE
do
 ARR+=("$LINE")
done < /def/$FILE
Případně lze využít i tuto syntaxi:
for LINE in $(< /def/$FILE)
do
 ARR=$((ARR+1))
done
Zde ale netuším, zda bash skutečně spouští subshell (ale jen jednou!) nebo zda-li využije přesměrování. Syntaxe spíše napovídá, že se interně spustí `cat /def/$FILE` a přesměruje standardní výstup.
6.11.2012 00:22 Delaunay | skóre: 17 | blog:
Rozbalit Rozbalit vše Re: Problém s načítáním souboru
Vlastně i v Tvém příkladě se subshell spustí jen jednou. Ukončí se při uzavření roury (skončení cyklu).
6.11.2012 12:57 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Problém s načítáním souboru
for LINE in $(< /def/$FILE)
do
 ARR=$((ARR+1))
done
To je nějaký nesmysl, to nacpe všechny slova ze souboru do toho for-in bloku a ve výsledku to nedělá to, co má (nečte to po řádcích). Možná jste měl na mysli tuto syntaxi, která je podobná jako ta s pipe, ale je to bez pipe, tudíž se proměnné zachovají:
while read LINE; do
ARR=$((ARR+1))
done < <(cat /def/$FILE)
6.11.2012 13:35 Delaunay | skóre: 17 | blog:
Rozbalit Rozbalit vše Re: Problém s načítáním souboru
Ano, ta druhá varianta bude fungovat pouze tehdy, když na jednotlivých řádcích vstupu bude vždy jen jedno slovo. Nedošlo mi to, když jsem zkoušel napsat rychlejší variantu téhož. No nepovedlo se, ale díky za upozornění ;-).
6.11.2012 14:27 Kit
Rozbalit Rozbalit vše Re: Problém s načítáním souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Hlavně je IMHO hloupost v bashi řešit podobné úlohy přes pole. Je potřeba opustit procedurální přístup a podívat se na celé zadání z jiného úhlu.
7.11.2012 12:28 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Problém s načítáním souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
bash na to má mapfile, stačí napsat
mapfile -t ARR < /def/${FILE}
Mimochodem, referenční příručka
When your hammer is C++, everything begins to look like a thumb.
7.11.2012 16:35 Kit
Rozbalit Rozbalit vše Re: Problém s načítáním souboru
Pěkná a rychlá vychytávka. Všiml jsem si, že má i alias readarray.

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.