Portál AbcLinuxu, 5. května 2025 13:11
#!/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 -- $NUMVý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.