Portál AbcLinuxu, 27. října 2025 17:48
#!/bin/bash
NUM=1
# 1) ztratí hodnotu NUM
# head -n 6 /proc/mounts | while read
# 2) zde hodnotu NUM udrží...
while [ $NUM -lt 5 ]
do
echo "NUM: "$NUM
NUM=$((NUM+1))
done
echo -- $NUM
Výstup pro první a druhý případ vypadá takto:
alnagon ~ % alnagon ~ % ./scripts/01_pk_test_script.sh NUM: 1 NUM: 2 NUM: 3 NUM: 4 NUM: 5 -- 1 alnagon ~ % alnagon ~ % ./scripts/01_pk_test_script.sh NUM: 1 NUM: 2 NUM: 3 NUM: 4 NUM: 5 -- 6 alnagon ~ % alnagon ~ %Lze nějak docílit, aby hodnotu NUM zachoval i ve formě "while read" ?
Řešení dotazu:
head -n 6 /proc/mounts | while readTady neco chybi ne ?
prikaz | while read ...
sa spusta subshell a premenna NUM je inicializovana mimo tohto subshellu, takze na nu cokolvek co sa deje v subshelli ( v slucke s while ), nema ziadny dosledok. Nasledne nemusi fungovat v kazdom shelli, ale bash minimalne to podporuje. Je to sposob, ako zabranit, aby sa vytvoril subshell.
#!/bin/bash
NUM=1
while read line
do
echo "NUM: "$NUM
echo "$line"
NUM=$((NUM+1))
done< <(head -n6 /proc/mounts)
echo -- $NUM
Rovnako sa chovaju premenne aj vo funkciach, ak sa neexportuju.
Pravda s tym exportom, musim priznat. :)
Taktiez je mozne pouzit cisto declare namiesto local, aj ked logickejsie a osobne tiez pouzivam local, ak chcem lokalne premenne. To len na doplnenie, ze je to ekvivalent, nie na opravu tvojho tvrdenia. To je spravne. ;)
#!/bin/bash
num=0
funkcia1(){
declare num
num=$RANDOM
echo num z funkcie1: $num
}
funkcia2(){
declare num
num=$RANDOM
echo num z funkcie2: $num
}
echo num: $num
funkcia1
echo num: $num
funkcia2
echo num: $num
Pajpa (teda |) spusta subshell, rovnako ako zatvorky. A subshell nemoze ovplyvnit to, co sa deje v "hlavnom" shelli.
Riesenim je pouzivat tu hodnotu len v subshelli, teda napr.
prikaz | while read VARIABLE; do echo "Tu mi premenna $VARIABLE funguje"; done
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.