Linux 在nohup中增加while循环会导致无限循环
而这在上海是有效的Linux 在nohup中增加while循环会导致无限循环,linux,bash,shell,sh,nohup,Linux,Bash,Shell,Sh,Nohup,而这在上海是有效的 i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ] do i=$((i+1)) date done 输出5个日期(导出$CONTAINERS\u COUNT=5) 以下内容进入无限循环 nohup sh -c " i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ] do i=$((i+1)) date done &" 我做错了
i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
do
i=$((i+1))
date
done
输出5个日期(导出$CONTAINERS\u COUNT=5
)
以下内容进入无限循环
nohup sh -c " i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
do
i=$((i+1))
date
done &"
我做错了什么?您需要将脚本放入
”
引号中
:=>sh -c 'i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
do
i=$((i+1))
date
done &'
:=>Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
说明:单引号将按原样处理字符串。而双引号将扩展
:=>i=4
:=>sh -c "i=5; echo $i"
4
:=>sh -c 'i=5; echo $i'
5
:=>
您需要将脚本置于
“
引号中
:=>sh -c 'i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
do
i=$((i+1))
date
done &'
:=>Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
说明:单引号将按原样处理字符串。而双引号将扩展
:=>i=4
:=>sh -c "i=5; echo $i"
4
:=>sh -c 'i=5; echo $i'
5
:=>
“
内部的扩展可以工作
使用set-x
时,它看起来如下所示:
$ set -x
$ nohup sh -c " i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
> do
> i=$((i+1))
> date
> done &"
+ nohup sh -c ' i=1; while [ 0 -ge 0 ]
do
i=1
date
done &'
在执行sh
之前,循环扩展到,而[0-ge0]
。因此sh
看到的是[0-ge0]
——一个无止境的循环
我建议对脚本内容使用单引号来处理大多数引用问题,并使用导出的变量或按脚本位置参数传递环境:
nohup sh -c '
CONTAINERS_COUNT=$1
i=1;
while (( CONTAINERS_COUNT >= i )); do
i=$((i+1))
date
done
' -- "$CONTAINERS_COUNT" &
旁注:这只是seq“$CONTAINERS\u COUNT”| xargs-I{}日期内部的扩展”
工作
使用set-x
时,它看起来如下所示:
$ set -x
$ nohup sh -c " i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
> do
> i=$((i+1))
> date
> done &"
+ nohup sh -c ' i=1; while [ 0 -ge 0 ]
do
i=1
date
done &'
在执行sh
之前,[0-ge 0]
将循环扩展到。所以所有的sh
看到的都是[0-ge0]
-一个无止境的循环
我建议对脚本内容使用单引号来处理大多数引用问题,并使用导出的变量或按脚本位置参数传递环境:
nohup sh -c '
CONTAINERS_COUNT=$1
i=1;
while (( CONTAINERS_COUNT >= i )); do
i=$((i+1))
date
done
' -- "$CONTAINERS_COUNT" &
旁注:这只是seq“$CONTAINERS_COUNT”| xargs-I{}日期
这是否回答了您的问题?所有的$(
在进入sh
@KamilCuk之前都被展开了。你能详细说明一下吗?好问题,我曾经遇到过这个问题,放弃之后就转到了python脚本。你不需要$(…)
围绕-ge
;[“$CONTAINERS\u COUNT”-ge“$I”]
很好。这回答了你的问题吗?所有的$(
在进入sh
@KamilCuk之前都被展开了。你能详细说明一下吗?好问题,我有一次遇到了这个问题,放弃之后就转到了python脚本。你不需要$(…)
围绕-ge
使用的变量;[“$CONTAINERS\u COUNT”-ge“$i”]
可以。