bash do loop出错 - 意外令牌'完成'附近出错

时间:2012-10-25 19:19:42

标签: bash loops while-loop

以下代码在运行时给出了一个错误,我无法看到出错的地方。

我也抬起头来。

while [inotifywait -m -r -e modify -e move -e create -e delete '/home/client/Files' ]; do
    echo "File Notification" | mail -s "Client File Notification" -t "test@test.com"
done

3 个答案:

答案 0 :(得分:3)

[是一个执行测试的命令。您不想测试有关inotify的内容,但希望测试该命令的结果。所以括号[ ... ]太多了。你必须写:

while inotifiwait ... ;do

或更好

while array_answer=($(inotifywait ...)); [ "$array_answer" ] ;do
    echo Event is: ${array_answer[0]}
    echo file is: ${array_answer[1]}
    ...
    done

答案 1 :(得分:2)

[实际上是一个命令名,是test的同义词,所以你需要前后空格。

改变这个:

while [inotifywait ... ]; do

到此:

while [ inotifywait ... ]; do

如果没有空间,shell可能会尝试执行一个名为[inotifywait的命令,这个命令可能不存在。 (您应该在问题正文中向我们显示错误消息;我最初没有注意到您在标题中引用了它。)

(请注意,;可以紧跟],因为;是shell元字符。)

答案 2 :(得分:1)

虽然F. Hauri对于while条件中的错误是正确的,但这并不能解释“意外令牌'完成'附近的错误”错误。您发布的命令中没有任何内容导致此错误,因此我怀疑您可能在文件中有不可见的字符,可能在行的末尾回车(它们是Windows / DOS文本文件的标准)。尝试使用cat -v查看脚本,并在行尾或其他任何奇怪的地方查找“^ M”。

如果问题是错误的回车,请使用dos2unix将其删除,然后切换到不首先添加它们的文本编辑器。