nohup内部的while循环增加会导致无限循环

问题描述 投票:0回答:2

虽然在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 &"

我在做什么错?

linux bash shell sh nohup
2个回答
1
投票

"内部的展开。

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


0
投票

您需要在'引号中添加脚本。

:=>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
:=>
© www.soinside.com 2019 - 2024. All rights reserved.