Di9
@Di9

Почему обнуляется переменная заданная внутри цикла (bash скрипт)?

Господа, пишу простой контроллер потоков и попал в просак, чувствую что какая-то мелочь, но найти не мог :(
Проблема заключается в том что я обрабатываю цикл и при удачном условии меняю переменную $freePipe чтобы закончить главный цикл, но я меняю ее внутри цикла второго уровня и когда проверяю ее в главном цикле чтобы продолжить его или остановиться, то у нее сбрасывается значение. Ниже упрощенный код
freePipe="0"
	while [ "$freePipe" == 0 ]
	echo $freePipe
	do
		echo "Начинаем подбор"
		echo $freePipe

		cat $ipListFile | while read line
		do
			freePipe=$line
			echo "1 - $freePipe"
		done
		echo "2 - $freePipe"
		sleep 1
	echo "3 - $freePipe"
	done

Нужно вывести $freePipe а получаю freePipe=0 всегда :(
Причем echo 1 показывает заданное значение, а 2 и 3 показывают "0"
  • Вопрос задан
  • 1388 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Вы вызываете внешнюю команду cat с конвейером "|", и все что идет в блоке после конвейера - будет работать в отдельной оболочке. Отсюда "echo 1 freePipe" будет выводить внутреннюю переменную процесса cat, а не вашего цикла.

Да, а чтобы закончить цикл, пользуйтесь exit или break.
Команда break может иметь аргумент, чтобы закончить цикл определенной вложенности.
например

while true
do
   while true
   do
      while true
      do
         break 2
         echo 3
      done
      echo 2
   done
   echo 1
done


будет выводить только 1, потому что break выйдет из двух вложенных циклов, оставшись в третьем (то есть самом внешнем)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@aol-nnov
while [ condition ]
do
  op1
  op2
done


и еще надо вспомнить, кажется в коде выше будет subshell, внутри него присвоение и потом выход. ясное дело, что в родительском шелле это присвоение никак не отразится.

кстати, "упрощенный код" какой-то бессмысленный и беспощадный.
Ответ написан
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Буханка и рожки от троллейбуса.

gnu parallel или xargs тебе в помощь. https://debian.pro/1834
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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