Portál AbcLinuxu, 11. května 2025 10:44

Dotaz: shell - oprava kódu

22.10.2012 19:50 rBAR
shell - oprava kódu
Přečteno: 261×
Odpovědět | Admin
Zdravím, sažím se načíst jednotlivé řádky ze souboru do pole a následně je rozpůlit podle znaku IFS a uložit každou půlku do samostatné proměnné. Poradí někdo kde mám problém?
IFS="+"

PART=()
i=0
while read line
do
  PART=("$line")
  PART_L_"$i"="${PART[0]}"
  PART_P_"$i"="${PART[1]}"
  (( i++ ))
done</tmp/fce.txt

v souboru instalace.txt je každý řádek v uvozovkách
"funkce_jedna+FCE Jedna"
"funkce_dve  +FCE Dvě  "
"funkce_tri  +FCE Tři  "  
Když vypíšu třeba $PART_L_3 tak se nic nevypíše.... Poraďte prosím. D.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.10.2012 20:16 l4m4
Rozbalit Rozbalit vše Re: shell - oprava kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Myslíš další problém kromě toho, že se snažíš zpracovávat komplexní data v shellu?

Na první pohled je nesmysl toto:

PART_L_"$i"=...

Nejenže to neudělá, co čekáš, ale na tohle ti snad shell musí reagovat errorem, takže mě překvapuje, že si stěžuješ pouze na to, že je PART_L_3 prázdná (což tak jako tak být musí, když při číslování od nuly dostane poslední položka souboru číslo dva). Je-li nutné něco podobného dělat, musíš použít eval:

eval PART_L_"$i"=...

Ale možná by bylo lepší popsat, co má být celkový výsledek té operace, protože ji nejspíš lze provést bez bastlení v shellu.
22.10.2012 20:56 camel1cz | skóre: 25
Rozbalit Rozbalit vše Re: shell - oprava kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
To IFS ti ovlivní chování funkce read, ale té dáváš pouze jeden parametr a tak to shell nemá kam nacpat a celý rádek dá do proměnné line... řešení jsou 2:

a) buď přidej fci read parametr -a (proměnnou line bude pak brát jako pole a nastaví ho podle IFS) a nebo

b) dej fci read druhý parametr a pak ti rovnou dá vše před IFS do první proměnné a za IFS do druhé proměnné...

Jinak ale souhlas s kolegou - zpracovávat taková data v shellu je řekněme nestandardní :-)

22.10.2012 21:00 Delaunay | skóre: 17 | blog:
Rozbalit Rozbalit vše Re: shell - oprava kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
awk
22.10.2012 21:12 Kit
Rozbalit Rozbalit vše Re: shell - oprava kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
To se všichni zbláznili, že chtějí v Bashi řešit práci s polem? Bash to umí, ale je to nepřehledné, líné a nepříliš bezpečné. Proč si na to nevezmeš jiný nástroj, který na takové záležitosti byl vytvořen, třeba AWK nebo Perl?
23.10.2012 13:40 mike
Rozbalit Rozbalit vše Re: shell - oprava kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
#!/bin/bash

FNAME=tst_in
OUT_FNAME_1=tst_out_1
OUT_FNAME_2=tst_out_2

OUT_FNAME=$OUT_FNAME_1
for line in $(cat $FNAME)
do
    if [ x$line = "x+" ]
    then
	OUT_FNAME=$OUT_FNAME_2
    else
	echo $line >> $OUT_FNAME
    fi
done
23.10.2012 14:24 mike
Rozbalit Rozbalit vše Re: shell - oprava kódu
nepochopeno zadani
23.10.2012 13:56 Kit
Rozbalit Rozbalit vše Re: shell - oprava kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
tr -d '"' <instalace.txt |
   while IFS="+" read a b; do
      echo "$a, $b"
   done
23.10.2012 15:13 l4m4
Rozbalit Rozbalit vše Re: shell - oprava kódu
Akorát následující pořadavek bude, že potřebuje ty proměnné i po skončení roury...
23.10.2012 15:20 Kit
Rozbalit Rozbalit vše Re: shell - oprava kódu
To je mi jasné, ale už se mi s takovou hloupostí nechtělo patlat. Chtěl jsem tím jen ukázat, že příkaz read může mít víc parametrů. Zadání je nesmyslné, tak proč to řešit do detailů?

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.