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