【问题标题】:Error with bash do loop - error near unexpected token 'done'bash do 循环出错 - 意外令牌“完成”附近出错
【发布时间】:2012-10-25 19:19:42
【问题描述】:

下面的代码在我运行时给了我一个错误,我看不到我哪里出错了。

我也查过了。

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

【问题讨论】:

    标签: bash loops while-loop


    【解决方案1】:

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

    while inotifiwait ... ;do
    

    或更好

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

    【讨论】:

    • 好点;我在' ' 之后看到了缺失的空格,但没有注意到该命令首先不应该放在方括号之间。
    【解决方案2】:

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

    改变这个:

    while [inotifywait ... ]; do
    

    到这里:

    while [ inotifywait ... ]; do
    

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

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

    【讨论】:

    • 正如@F.Hauri 的回答正确指出的那样,inotifywait 命令首先不应该放在方括号之间。
    【解决方案3】:

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

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

    【讨论】:

    • 这是 Cygwin 下的常见问题。许多 Cygwin 命令可以处理 DOS 风格的行尾,但 shell 不能;它将done^M 视为命令名称,其中^M 是ASCII 回车符。复制并粘贴错误消息会很有帮助。请注意,dos2unix 会替换其输入文件,这与大多数 Unix 文本过滤器命令不同。
    • 感谢您的帮助,我是 shell 脚本的新手,所以我不知道 [] 括号测试用例。导致我的错误的问题是我在 Windows 模式下使用记事本,我将其切换到 unix 模式并解决了问题。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2017-10-18
    • 2015-05-10
    • 2015-01-01
    • 2018-07-03
    相关资源
    最近更新 更多