']' 预期 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,因此没有关闭 ]
被发现。
当 运行 运行我的 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,因此没有关闭 ]
被发现。