Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在nohup中增加while循环会导致无限循环_Linux_Bash_Shell_Sh_Nohup - Fatal编程技术网

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”]
可以。