До тех пор, пока цикл не завершится или не сохранит значение инкрементной переменной
Почему этот цикл не прерывается (заканчивается из-за if
заявление) или с использованием недавно увеличенного значения $c
переменная? Пробовал c=expr $c + 1 с и без "
двойная кавычка.
export c=1; ssh auser@someserver "until [[ 1 -eq 2 ]]; do echo \"Value of 'c' == $c\"; c=`expr $c + 1`; echo \"$c - Incremented value: `expr $c + 1`\"; if [[ $c -gt 5 ]]; then break; fi; sleep 2 ; done;"
или же
$ export c=1; ssh root@$CHEF_SERVER \
> "until [[ 1 -eq 2 ]]; do \
> echo \"Value of 'c' == $c\"; c=`expr $c + 1`; \
> echo \"$c - Incremented value: `expr $c + 1`\"; \
> if [[ $c -gt 5 ]]; then break; fi; \
> sleep 2; \
> echo; \
> done;"
Вывод бесконечен: я должен был это сделать.
Value of 'c' == 1
1 - Incremented value: 2
Value of 'c' == 1
1 - Incremented value: 2
Value of 'c' == 1
1 - Incremented value: 2
Value of 'c' == 1
1 - Incremented value: 2
Value of 'c' == 1
1 - Incremented value: 2
Value of 'c' == 1
1 - Incremented value: 2
Value of 'c' == 1
1 - Incremented value: 2
Value of 'c' == 1
1 - Incremented value: 2
Value of 'c' == 1
1 - Incremented value: 2
Value of 'c' == 1
1 - Incremented value: 2
Killed by signal 2.
2 ответа
Вы должны понимать, что переменные оболочки должны быть правильно экранированы, прежде чем использовать их в условных выражениях или присваиваниях внутри ssh
под двойными кавычками. В противном случае переменные будут расширяться даже до того, как команды будут выполнены на удаленном компьютере. Так что в вашем случае, независимо от того, если вы увеличиваете c
или нет переменная расширяется, и условие всегда остается таким же, как показано ниже на удаленном компьютере.
if [[ 1 -gt 5 ]]; then
break
fi
Также expr
в значительной степени устарела, используйте традиционное приращение цикла в стиле C, используя ((..))
как и избежать всех вызовов переменной внутри, чтобы отложить расширение переменной
ssh root@$CHEF_SERVER "
until [[ 1 -eq 2 ]]; do
((c = c+1))
echo "Incremented value: \$c"
if [[ \$c -gt 5 ]]; then
break
fi
sleep 2
done"
Переменные раскрываются внутри строк в двойных кавычках. Так же есть неприятности.
Вы объявляете переменную c
и присвойте ему значение 1
,
Вы тогда звоните ssh
и передайте ему строку в двойных кавычках.
Оболочка, вызванная ssh, видит:
until [[ 1 -eq 2 ]]; do
echo "Value of 'c' == 1"; c=2;
echo "1 - Incremented value: 2";
if [[ 1 -gt 5 ]]; then break; fi;
sleep 2;
echo;
done;