Portál AbcLinuxu, 5. května 2025 16:51
#!/bin/bash echo -e "1\n2\n3" | while read line do echo "while: $line" a=ahoj done echo $aPosledni echo nevypise hodnotu promenne a, ktera byla inicializovana v tele cyklu while. Muzete mi prosim poradit proc a jak tomu zabranit? Dekuji.
#!/bin/bash a=aaa echo -e "1\n2\n3" | while read line do echo "while: $line" a=ahoj done echo $aVypise to "aaa" ale ja chci vypsat "ahoj"
#!/bin/bash a=aaa echo -e "1\n2\n3" | while read line do echo "while: $line" $a=ahoj done echo $a
Pokud chces nastavovat tu globalni tak tam prihod predtoa=ahoj
znak:$
Než začnete podobné věci někomu radit, ověřte si, prosím, jestli mají šanci fungovat.
Jak bylo receno, problem je v tom ze roura |
spusti subshell, ktery ma vlastni promennou. Promenne v bashi jsou promenne prostredi a lze je predavat pouze potomkum soucasneho procesu a ne predkum. V momente kdy while
skonci, skonci i subshell a promenna taky.
Predat promennou o uroven vys lze ale nekolika jinymi zpusoby. Kazda ma sve pro a proti.
echo -e "1\n2\n3" | while read line do echo "while: $line" echo ahoj >docasnysoubor done a=`cat docasnysoubor` rm -f docasnysoubor
`
resp. $()
.
a=$(echo -e "1\n2\n3" | while read line do echo ahoj done)
echo -e "1\n2\n3" | ( while read line do echo "while: $line" a=ahoj done echo a dalsiveci )
4. Chcete-li v tom cyklu zpracovávat pevný text, je zbytečné na to používat rouru, jednodušší je "here document":
#!/bin/bash while read line; do echo "while: $line" a=ahoj done <<EOF 1 2 3 EOF
5. Chcete-li opravdu zpracovávat výstup programu, dá se to obejít pomocí "process substitution":
#!/bin/bash exec 3< <(echo -e "1\n2\n3") while read line; do echo "while: $line" a=ahoj done <&3 echo "a=$a"
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.