2016-10-10 66 views
2

包围当运行我的bash脚本,我有以下错误:']' 预期的Bash语法错误 - 尽管`]`存在,并通过空间

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

第16行是:

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

通常这个错误来自[]条件中的缺失空间,但我没有忘记它。 这里开始,在第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]*).+/\1/') 
       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脚本,它的工作,直到<<<得到满足,这是可以理解的,但没有关于失踪]

回答

5
错误

您的错误源于存在Unicode空格(在非ASCII范围内)紧接在关闭]之后,具体为NO-BREAK SPACE Unicode字符(Unicode U + 00A0)。

Bash无法识别这样的空白,这就是为什么它找不到结束][1]

您可以验证这一点,如下所示:

LC_ALL=C cat -et myscript.sh 

揭示了非ASCII字符作为元组合键。
Unicode不间断空格显示为M-BM-

顺便说一句,当SO 呈现你的代码有问题,这些不中断空格转换为常规空格,所以复制&粘贴代码并发现问题 - 只检查的源代码你的问题是。


如果你想在非ASCII空格和标点符号的自动翻译UTF-8编码的文件为与其最接近的ASCII等价物,你可以用我的nws(空白规范化)CLI;例如:
nws --ascii -i.bak myscript.sh
nws可以通过执行[sudo] npm install -g nws-cli或者从repository手动安装via the npm registry


[1] []必须从周围元件由空白,以便被分离以被识别为通过击语法元素。在这种情况下,Bash看到单词]<no-break-space>,因为不间断空间不是Bash的空白空间,所以没有找到结束]

+0

你说得对unicode空白,我检查你的命令并删除它,脚本现在正在工作。但看起来是在关闭']' – aze

+0

哇之后,但你是如何找到OP的源代码? :) – anubhava

+0

@ user3714670:谢谢 - 是的,没有休息空间来了'''''''我更新了我的帖子。 – mklement0