在 nohup 中递增 while 循环会导致无限循环

Incrementing while loop inside nohup causes an infinite loop

虽然这适用于 sh

i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
do
    i=$((i+1))
    date
done

输出 5 个日期 (export $CONTAINERS_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
:=>

内部扩展 " 有效。

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 &'

您的循环扩展为 while [ 0 -ge 0 ] 执行 sh 之前。所以 sh 看到的是 [ 0 -ge 0 ] - 一个无限循环。

我建议对脚本内容使用单引号来处理大多数引用问题,并使用导出变量或脚本位置参数传递环境:

nohup sh -c '
   CONTAINERS_COUNT=
   i=1;
   while (( CONTAINERS_COUNT >= i )); do
      i=$((i+1))
      date
   done
' -- "$CONTAINERS_COUNT" &

旁注:只是 seq "$CONTAINERS_COUNT" | xargs -I{} date