']' 预期 Bash 语法错误 - 尽管存在 `]` 并被空格包围

']' expected Bash syntax error - despite `]` being present and surrounded by spaces

当 运行 运行我的 bash 脚本时,出现以下错误:

./myscript.sh:[:16: ']' expected

第 16 行是:

    [ -d "$dir" ] && echo "$dir" && for file in "$dir"/*/*

通常错误来自 [] 条件中缺少 space 但我没有忘记它。 这是脚本的其余部分,从第 14 行开始:

for dir in "$message_directory"/*
do
    [ -d "$dir" ] && echo "$dir" && for file in "$dir"/*/*
    do
        if [ -d "$file" ] ; then
            if [[ -f "$file"/Message.txt || -f "$file"/Message.html ]] ; then
                hashMD5=$(md5sum "$file/message"* | cut -d " " -f1 | head -n 1)
                todelete=$(find "$directory_to_check" -type f -not -path "*$message_directory*" -name "Message*" -exec md5sum "{}" \; | grep "^$hashMD5" )
                todelete=$(echo "$todelete" | tr -s " " | cut -d " " -f2-)
                todelete=$(echo "$todelete" | sed -E 's/(Message[0-9][0-9]*).+//' )
                if [[ ! -z "$todelete" ]] ; then
                    echo "searching for hash : $hashMD5"
                    while read -r line; do
                        message_todelete=$(echo "$line")
                        echo "I will delete : $message_todelete"
                        md5sum "$todelete/Message"* | head -n 1
                        #rm -r "$line"
                    done <<< "$todelete"
                fi
            fi

        fi
    done
done

我尝试 运行 带有 dash 的脚本,它一直有效,直到满足 <<<,这是可以理解的,但没有关于缺少 ][= 的错误18=]

你的错误源于 Unicode whitespace(在非 ASCII 范围内)紧跟在结束 ] 之后,特别是 NO -BREAK SPACE Unicode 字符 (Unicode U+00A0)。

Bash不认识这样的白space,所以找不到结尾].[1]

您可以通过以下方式验证:

LC_ALL=C cat -et myscript.sh

将非 ASCII 字符显示为元键组合。
Unicode 不间断 spaces 显示为 M-BM-.

顺便说一句,当 SO 呈现 你在问题中的代码时,这些不间断 spaces 被转换为常规 spaces,所以复制 &粘贴您的代码 不会 揭示问题 - 只有检查您问题的 源代码 才能揭示问题。


如果你想自动翻译非 ASCII 白色 space 和 UTF-8 编码文件中的标点符号到最接近的 ASCII 等价物,你可以使用我的 nws (white-space规范化)CLI;例如:
nws --ascii -i.bak myscript.sh.
nws可以安装via the npm registry by executing [sudo] npm install -g nws-cli, or manually from the repository.


[1] [] 必须用 whitespace 与周围的元素分开,以便被 Bash 识别为语法元素。在这种情况下,Bash 看到了单词 ]<no-break-space>,因为从 Bash 的角度来看,no-break space 不是白色 space,因此没有关闭 ] 被发现。