Почему?Это происходит потому, что:
cat file | while read line; do
echo "$line"
lines[$num]="$line"
((num++))
echo "num = $num"
done
выполняет оператор while
в отдельном процессе, со своей собственной средой, не затрагивая родительскую среду.Точно так же вы обнаружите, что массива lines
там тоже нет.
Следующий упрощенный скрипт показывает это в действии:
#!/bin/bash
export xyzzy=42
echo urk | while read line; do
xyzzy=999
echo $xyzzy
done
echo $xyzzy
Вывод этого скрипта:
999
42
, поскольку в подпроцессе задано значение переменной 999
.
В нижней строке, если вы хотите, чтобы информация отображалась в текущем процессе (сценарии), выВам нужно будет выполнить работу в сценарии или найти какой-то другой способ получить информацию из подпроцесса.
Если вы используете перенаправление ввода вместо запуска подпроцессаТрубопровод, он должен работать как хочешь.Это связано с тем, что бит while
выполняется в контексте current , а не отдельного процесса в конвейере.Например:
#!/bin/bash
export xyzzy=42
while read line; do
xyzzy=999
echo $xyzzy
done <<EOF
hello
EOF
echo $xyzzy
произведет:
999
999
Для вашего конкретного случая замените:
done <<EOF
hello
EOF
на:
done <file