Portál AbcLinuxu, 11. května 2025 10:21
cat soubor|while read FROM TO
do
echo $FROM $TO
done
echo $FROM $TO # 1. tohle uz netiskne proc?
2. jak promennou dostat ven z cyklu aby posledni prikaz chodil?
diky!
Protože FROM TO je na konci cyklu prázdné (konec souboru), čili nemá co tisknout.
|
pousti subshell a nelze propagovat promenne ze subshellu do nadrazeneho shellu. Musis si udelat pomocny soubor a do nej promenne vypsat a po skonceni cyklu zase precist.
[babjak][~/tmp/while][17:35:14] ls input.txt script.sh* [babjak][~/tmp/while][17:37:17] cat input.txt a b c d e [babjak][~/tmp/while][17:37:19] ./script.sh input.txt From: 'a' To: 'b' From: 'c' To: 'd e' [babjak][~/tmp/while][17:37:28] cat script.sh #! /bin/sh while read FROM TO ; do echo "From: '${FROM}' To: '${TO}'" done < "${1}" [babjak][~/tmp/while][17:37:33]
[babjak][~/tmp/while][17:43:58] cat input.txt a b c d e [babjak][~/tmp/while][17:44:00] ./script.sh input.txt Inside From: 'a' To: 'b' Inside From: 'c' To: 'd e' Outside From: 'c' To: 'd e' [babjak][~/tmp/while][17:44:09] cat script.sh #! /bin/sh while read FROM TO ; do echo "Inside From: '${FROM}' To: '${TO}'" X="${FROM}" Y="${TO}" done < "${1}" echo "Outside From: '${X}' To: '${Y}'"Problem je v tom, ze v povodnom skripte v skutocnosti ten posledny riadok skutocne vypysuje obsah premennych
FROM
a TO
. Treba si vsak uvedomit, ze ked sa slucka while read ...
vykonala posledny krat, bol dosiahnuty koniec suboru a do tychto premennych sa nacitalo ... chvila prekvapenia ... nic.
< soubor while read ... ;do ...Pokud máte něco složitějšího (sed, nebo nějakou delší rouru), lze ve vykonávání programu pokračovat v subshellu, včetně jeho výhod (tj. proměnných):
dlouha | roura | ( while read ...; do ... zde je cyklus, v něm něco nastavím ... ; done ... zde je další zpracování -- ve stejném subshellu ... používám nastavené proměnné z cyklu ... )Tímto se vyhnete použití dočasných souborů.
while read line; do echo $line last=$line done < <(cat /etc/passwd | cut -d : -f 1) echo last: $last
$ < <(cat /etc/passwd | cut -d : -f 1) tac ftp messagebus nobody pht root
while read; do echo $REPLY; done <<<"hokus pokus"také neobrátíte.
The following redirection operators may precede or appear anywhere within a simple command or may follow a command.tj. před lze dát jen v případě, že to není cyklus, závorka, apod. Čili by nefungoval ani mnou navrhovaný jednoduchý "< soubor", což je škoda.
set -- `echo a b c`A premenne $1 $2 a $3 budu obsahovat a, b, c.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.