虽然在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=$1
i=1;
while (( CONTAINERS_COUNT >= i )); do
i=$((i+1))
date
done
' -- "$CONTAINERS_COUNT" &
旁注:仅为seq "$CONTAINERS_COUNT" | xargs -I{} date