Bash脚本错误:在查找匹配的`'';

Bash脚本错误:在查找匹配的`'';,bash,macos,shell,Bash,Macos,Shell,我正在尝试运行此shell脚本,但出现以下错误: 查找匹配的“”时出现意外的EOF 及 语法错误:意外的文件结尾 当我将.asd/'切换到.asd/'时没有错误,但似乎什么也没发生。脚本的目标是告诉我/music中的哪些音乐文件没有相应的.asd文件。脚本是: #!/bin/bash files=`mdfind -onlyin ~/Music “kMDItemUserTags==Green” | sed -E -e 's/\.[a-zA-Z1-3]+$/.asd/‘` for aFile in

我正在尝试运行此shell脚本,但出现以下错误:

查找匹配的“”时出现意外的EOF

语法错误:意外的文件结尾

当我将.asd/'切换到.asd/'时没有错误,但似乎什么也没发生。脚本的目标是告诉我/music中的哪些音乐文件没有相应的.asd文件。脚本是:

#!/bin/bash
files=`mdfind -onlyin ~/Music “kMDItemUserTags==Green” | sed -E -e 's/\.[a-zA-Z1-3]+$/.asd/‘`
for aFile in $files 
do
    if [ ! -e $aFile ]; then
        echo $aFile;
    fi
done

提前感谢您的帮助。

mdfind中似乎包含了卷曲引号。卷曲引号的解释与直引号不同。因此,在用
”替换
解决文件结束错误时,您可能没有将任何内容与
“kMDItemUserTags==Green”
匹配。尝试将其替换为
“kMDItemUserTags==Green”
,看看是否有效

单引号的情况是,它匹配的是第一个引号,而不是第二个引号,因此当您到达结束引号(卷曲)时,它会一直认为这是引号字符串的一部分,并一直读取到文件结束(
EOF

希望有帮助

补充:

对于语法检查shell脚本的赞扬已经被唱了很多遍,这是有道理的:

如果我们将您的脚本粘贴到那里(为了可读性将管道拆分为两行之后),我们会得到(附加的、附带的消息在此省略,但在下面进一步列出):

如您所见,您可能已经确定了您的问题,并且还提供了以下指针:

Line 2:
files=`mdfind -onlyin ~/Music “kMDItemUserTags==Green” | 
      ^-- SC2006: Use $(..) instead of legacy `..`.

Line 6:
    if [ ! -e $aFile ]; then
              ^-- SC2086: Double quote to prevent globbing and word splitting.

Line 7:
        echo $aFile;
             ^-- SC2086: Double quote to prevent globbing and word splitting.

此外,您不应该为
枚举带有
的文件名,因为这会与带有嵌入空格的文件名相冲突

相反,请使用:

while IFS= read -r aFile; do
  # work with "$aFile"
done < <(mdfind -onlyin ~/Music ...)

而IFS=read-r aFile;做
#使用“$aFile”

完成
在上下文中肯定会有所不同,嗯。谢谢你的快速回答!不幸的是没有运气——也许剧本有问题(或者我误解了——剧本是为我写的;我不在我的知识范围之内)。当我运行脚本时,将双引号和单引号都变直(并且不使用反勾号)不会产生任何结果。更正双引号并保持单引号不变会产生与以前相同的错误,但我认为我不应该这样做。@Farinuts:“更正”引号是绝对必要的;如果在此之后没有得到结果,则意味着您的Spotlight查询(
mdfind…
)将不返回任何结果。我建议你接受这个答案,因为它解决了你原来的问题,如果你有一个关于
mdfind
命令为什么不起作用的后续问题,请提出一个新问题。无论你用什么编辑器编写脚本,都不要使用它。这看起来像是一个MS Word文本文件被保存为脚本,使用了所有漂亮的UTF-8卷曲引号而不是ASCII纯引号。
而IFS=read-r aFile
将在名称包含嵌入换行符的文件上失败。您实际上只能在nul字节上可靠地进行拆分。例如,
虽然读取-d$'\0'
,但更明智的做法是强制执行文件名中不允许空白的策略。
while IFS= read -r aFile; do
  # work with "$aFile"
done < <(mdfind -onlyin ~/Music ...)