我正在尝试设置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
答案 0 :(得分:3)
您想通过以下方式实现目标:
currentSize= du -s /root/Dropbox | cut -f 1
是捕获/root/Dropbox
中currentSize
的当前大小。那没有发生。那是因为在设置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
关闭调试模式。)
我希望这会有所帮助。