Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
为什么这个bash while循环是无限的?_Bash_While Loop_Infinite - Fatal编程技术网

为什么这个bash while循环是无限的?

为什么这个bash while循环是无限的?,bash,while-loop,infinite,Bash,While Loop,Infinite,这是我第一次制作bash脚本 我正在尝试创建一个bash脚本,该脚本将删除目录中最旧的文件,直到该目录小于某个大小。我希望在目录小于10000字节时停止while查找。10000只是为了测试;我稍后会增加 du和cut将以字节为单位的目录大小放入名为check的变量中 当文件大小大于10000字节时,应运行while外观。 对于每个迭代,删除目录中最旧的文件 当我运行这个脚本时,最旧的文件被删除,但即使$check小于10000,它也会无限重复。为什么这个脚本一直无限地运行 check = $(

这是我第一次制作bash脚本

我正在尝试创建一个bash脚本,该脚本将删除目录中最旧的文件,直到该目录小于某个大小。我希望在目录小于10000字节时停止while查找。10000只是为了测试;我稍后会增加

du和cut将以字节为单位的目录大小放入名为check的变量中 当文件大小大于10000字节时,应运行while外观。 对于每个迭代,删除目录中最旧的文件

当我运行这个脚本时,最旧的文件被删除,但即使$check小于10000,它也会无限重复。为什么这个脚本一直无限地运行

check = $(du -sb /home/chris/Dropbox/VideoMonitor | cut -f1)

while [ $check -gt 10000 ]
check = $(du -sb /home/chris/Dropbox/VideoMonitor | cut -f1)
do
cd /home/chris/Dropbox/VideoMonitor
ls /home/chris/Dropbox/VideoMonitor -1tr | head -1 | xargs rm
done
这是脚本从目录中删除所有文件后得到的输出

rm: missing operand
Try 'rm --help' for more information.

这一过程反复进行,我想在重新分配
check
之前必须执行
do
。否则,它实际上不是循环体的一部分。此外,赋值可能应该在主体执行之后(以及循环条件的下一次测试之前)完成:


我还删除了
=
周围的空格,使您的
检查=…
行实际上是赋值语句。

我想
检查必须在重新分配
检查之前进行。否则,它实际上不是循环体的一部分。此外,赋值可能应该在主体执行之后(以及循环条件的下一次测试之前)完成:


我还删除了
=
周围的空格,使您的
check=…
行实际上是赋值语句。

while循环子句中有两个命令,
[$check-gt 10000]
check=$(du-sb/home/chris/Dropbox/VideoMonitor | cut-f1)
(由于
=
-符号周围有空格,这是一个错误的命令,不是一个关联)。后一个命令是唯一确定while循环是否终止的命令。如果其返回代码始终为0,则while循环永远不会结束


如果没有文件,则
rm
命令没有操作数,因此会显示错误消息。

while循环子句中有两个命令,
[$check-gt 10000]
check=$(du-sb/home/chris/Dropbox/VideoMonitor | cut-f1)
(由于
=
-符号周围有空格,这是一个错误的命令,不是一个关联)。后一个命令是唯一确定while循环是否终止的命令。如果其返回代码始终为0,则while循环永远不会结束


如果没有文件,则
rm
命令没有操作数,因此会显示错误消息。

脚本中有两个错误:

第一个错误是坏的
,而
子句应该是

while condition; do
    commands
done

然而,
条件
可能是返回零或非零的测试表达式,正如您正确编写的:

线路

check = $(du -sb /home/chris/Dropbox/VideoMonitor | cut -f1)
do
被错误定位之前。我打赌您希望将其放在
do
之后以再次获取值

第二个错误是您的
xargs
用法。由于要传递给
xargs
的文件列表可能为空,因此您需要添加开关
--如果为空则不运行
,以修复
rm:missing operand
错误

为了避免两次写入
check
行,您可以编写一个while-true循环,检查循环内部的条件并中断循环,因为bash没有头部控制的while循环

while [ true ]; do
   check = ...
   if [ $check -le 10000 ]; then
       break
   fi

   ...
done

其他建议

  • 在循环中,您不需要每次都执行
    cd
    ,请在之前执行
  • 如果要删除超过特定时间的文件,而不是通过检查目录大小来删除文件,可以使用
    find-mtime+N
    (查找修改日期早于
    N
    天的文件)
  • 有时bash的
    pushd
    popd
    cd
    上非常方便,因为
    cd
    在脚本执行后更改了目录,您需要记住上一个目录为
    cd back。使用
    pushd
    可以告诉bash设置当前目录,其中
    popd`将您带回到当前目录上一个目录

    • 您的脚本中有两个错误:

      第一个错误是坏的
      ,而
      子句应该是

      while condition; do
          commands
      done
      

      然而,
      条件
      可能是返回零或非零的测试表达式,正如您正确编写的:

      线路

      check = $(du -sb /home/chris/Dropbox/VideoMonitor | cut -f1)
      
      do
      被错误定位之前。我打赌您希望将其放在
      do
      之后以再次获取值

      第二个错误是您的
      xargs
      用法。由于要传递给
      xargs
      的文件列表可能为空,因此您需要添加开关
      --如果为空则不运行
      ,以修复
      rm:missing operand
      错误

      为了避免两次写入
      check
      行,您可以编写一个while-true循环,检查循环内部的条件并中断循环,因为bash没有头部控制的while循环

      while [ true ]; do
         check = ...
         if [ $check -le 10000 ]; then
             break
         fi
      
         ...
      done
      

      其他建议

      • 在循环中,您不需要每次都执行
        cd
        ,请在之前执行
      • 如果要删除超过特定时间的文件,而不是通过检查目录大小来删除文件,可以使用
        find-mtime+N
        (查找修改日期早于
        N
        天的文件)
      • 有时bash的
        pushd
        popd
        cd
        上非常方便,因为
        cd
        在脚本执行后更改了目录,您需要记住上一个目录为
        cd back。使用
        pushd
        可以告诉bash设置当前目录,其中
        popd`将您带回到当前目录上一个目录
      • check=$(du -sb /home/chris/Dropbox/VideoMonitor | cut -f1) while [ $check -gt 10000 ] check = $(du -sb /home/chris/Dropbox/VideoMonitor | cut -f1) do cd /home/chris/Dropbox/VideoMonitor ls /home/chris/Dropbox/VideoMonitor -1tr | head -1 | xargs rm done