在bash中有一个while循环的一元运算符

时间:2012-06-20 18:19:04

标签: bash while-loop unary-operator

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

输出

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

3 个答案:

答案 0 :(得分:3)

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

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

是捕获/root/DropboxcurrentSize的当前大小。那没有发生。那是因为在设置shell变量时空白是很重要的,所以它们之间存在差异:

myVar=foo

myVar= foo

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

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

while [ -lt 1048576 ]

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

要实现您的意图,请使用Bash command substitution

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

答案 1 :(得分:1)

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

这不符合你的想法。

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

答案 2 :(得分:0)

你需要重新编写'currentSize ...'行

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

您的代码将currentSize的值保留为空。

您可以发现此类问题(通过一些练习),但使用shell调试功能

set -vx

位于脚本的顶部,或者如果您认为自己确定哪里出现问题,请将您的suspiocus代码包围起来:

set -vx
myProblematicCode
set +vx

set +vx关闭调试模式。)

我希望这会有所帮助。