1

我正在尝试设置 bash 脚本,以便将文件从一个目录移动到指定的大小限制(在本例中为 1GB)。我试图让它进入循环,但我遇到了 while 语句的问题。它不断返回以下输出,我不知道为什么。如果我尝试在 while bash 中使用 "$currentSize" 表示它期望进行整数比较。但是 bash 中的变量应该是无类型的,所以我不能将它转换为整数,对吧?任何帮助都是适当的。

输出

54585096

1048576
./dbsFill.bsh: line 9: [: -lt: unary operator expected

代码

#!/bin/bash

currentSize= du -s /root/Dropbox | cut -f 1
maxFillSize=1048576
echo $currentSize
echo $maxFillSize

cd /srv/fs/toSort/sortBackup
while [ $currentSize -lt $maxFillSize ]

do
        #fileToMove= ls -1
        #rsync -barv --remove-source-files $fileToMove /root/Dropbox/sortme
#       mv -t /root/Dropbox/sortme $(ls -1 | head -n 1)
        #find . -type f -exec mv -t /root/Dropbox/sortme {} \;
        #currentSize= du -s /root/Dropbox | cut -f 1
#       sleep 5
        echo Were are here
done
4

3 回答 3

3

您要通过以下方式实现的目标:

currentSize= du -s /root/Dropbox | cut -f 1

是捕获/root/Dropboxin的当前大小currentSize。那没有发生。那是因为在设置 shell 变量时空格很重要,所以有以下区别:

myVar=foo

myVar= foo

后者尝试foo在环境变量myVar设置为空的情况下进行评估。

底线:currentSize被设置为空,第 9 行变为:

while [ -lt 1048576 ]

当然,-lt这不是 shell 在那种情况下所期望的一元运算符。

要实现您的意图,请使用Bash 命令替换

currentSize=$( du -s /root/Dropbox | cut -f 1 )
于 2012-06-20T18:34:42.427 回答
1
currentSize= du -s /root/Dropbox | cut -f 1

这并不像你认为的那样。

currentSize=$(du -s /root/Dropbox | cut -f 1)
于 2012-06-20T18:24:31.950 回答
0

您需要将您的“currentSize ...”行重写为

currentSize=$(du-s /root/Dropbox | cut -f 1)

您的代码将 currentSize 的值留空。

您可以发现此类问题(稍加练习),但使用 shell 调试功能

set -vx

在你的脚本的顶部,或者如果你认为你很确定哪里有问题,把你的可疑代码包围起来,比如:

set -vx
myProblematicCode
set +vx

set +vx关闭调试模式。)

我希望这有帮助。

于 2012-06-20T18:25:45.480 回答