Почему моя переменная локальна в одном цикле «while read», но не в другом, казалось бы, подобном цикле?

Почему я получаю разные значения для $x из нижеприведенных фрагментов?

#!/bin/bash

x=1
echo fred > junk ; while read var ; do x=55 ; done < junk
echo x=$x 
#    x=55 .. I'd expect this result

x=1
cat junk | while read var ; do x=55 ; done
echo x=$x 
#    x=1 .. but why?

x=1
echo fred | while read var ; do x=55 ; done
echo x=$x 
#    x=1  .. but why?
16 голосов | спросил Peter.O 23 MarpmWed, 23 Mar 2011 17:24:06 +03002011-03-23T17:24:06+03:0005 2011, 17:24:06

3 ответа


23

Правильное объяснение уже дано jsbillings и

ответил Gilles 24 MaramThu, 24 Mar 2011 00:21:45 +03002011-03-24T00:21:45+03:0012 2011, 00:21:45
9

У вас запущена проблема с областью переменных. Переменные, определенные в цикле while, который находится на правой стороне канала, имеют свой собственный контекст локальной области, и изменения в переменной не будут видны вне цикла. Цикл while - это, по сути, подоболочка, которая получает COPY оболочки оболочки, а любые изменения в среде теряются в конце оболочки. См. Этот вопрос StackOverflow .

ОБНОВЛЕНО . Я забыл указать на важный факт, что цикл while с его собственной подоболочкой был обусловлен тем, что он был конечной точкой для канала, я обновил это в ответ.

ответил jsbillings 23 MarpmWed, 23 Mar 2011 17:33:12 +03002011-03-23T17:33:12+03:0005 2011, 17:33:12
0
#!/bin/bash
set -x

# prepare test data.
mkdir -p ~/test_var_global
cd ~/test_var_global
echo "a"> core.1
echo "b"> core.2
echo "c"> core.3


var=0

coreFiles=$(find . -type f -name "core*")
while read -r file;
do
  # perform computations on $i
  ((var++))
done <<EOF
$coreFiles
EOF

echo $var

Result:
...
+ echo 3
3

он может работать.

ответил GPS 3 Mayam16 2016, 09:47:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132