在 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
虽然这适用于 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