linux - Until 循环不终止或保持增量变量的值

标签 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.

最佳答案

您需要了解 shell 变量在 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"

关于linux - Until 循环不终止或保持增量变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55014700/

相关文章:

linux - linux 命令的输出未从控制台中被抑制

linux - 在 gnuplot 中重新读取文件的命令和脚本

c# - 如何从 C#.net 客户端列出 linux 运行进程?

linux - monit 从启动程序命令中删除引号

Windows 批处理文件 && 运算符

bash - 不可能的 bash : syntax error: invalid arithmetic operator (error token is "")

java - 什么复制文件的方法可以处理波浪号? (~)

linux - 在第一次出现特定单词后用 sed 替换 - Linux/Ubuntu

php - 我无法授予 apache 写入文件的权限,我做错了什么?

shell - FileZilla 打破 rbash 和 scponly chrooting