До тех пор, пока цикл не завершится или не сохранит значение инкрементной переменной - PullRequest
2 голосов
/ 06 марта 2019

Почему этот цикл не прерывается (завершается из-за оператора 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;"

Вывод infinte: мне пришлось ^с этим.

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 ]

2 голосов
/ 06 марта 2019

Вы должны понимать, что переменные оболочки должны быть правильно экранированы , прежде чем использовать их в условных выражениях или присваиваниях внутри ssh в двойных кавычках.В противном случае переменные будут расширяться даже до того, как команды будут выполнены на удаленном компьютере.Таким образом, в вашем случае, независимо от того, увеличиваете ли вы c или нет, переменная не расширяется, а условие на удаленном компьютере всегда остается таким же, как показано ниже.

if [[ 1 -gt 5 ]]; then
    break
fi

Также expr в значительной степени устарело, используйтетрадиционное приращение цикла в стиле C с использованием ((..)) as и экранирование всех вызовов переменной внутри, чтобы отложить расширение переменной

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"
0 голосов
/ 06 марта 2019

Переменные раскрываются внутри строк в двойных кавычках. То же самое можно сказать и об обратном.

Вы объявляете переменную 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;
...