直到循环不终止或保持递增的变量的值

时间:2019-03-06 02:39:16

标签: linux bash shell until-loop

为什么该循环不会中断(由于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;"

输出是无限的:我必须^ c它。

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 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

变量在双引号内扩展。 反引号也是如此。

您声明变量c,并为其分配值1

然后您调用ssh并将其双引号字符串传递给它。

ssh调用的shell看到:

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;