我已经为工作编写了一个小型 bash 脚本:我正在尝试根据元数据自动更新文件。
总的来说,该脚本工作正常,但每当我保存新版本时,我都会收到错误:
egrep:括号不平衡
HOSTEDDATE=
如果我使用完全相同的语法重写开始的行,它会再次工作。我怀疑这与引号有关,引号的外观似乎发生了变化(首次键入时完全垂直,重新保存为新版本后呈角度)。
由于我在 TextEdit 中使用纯文本,这是一个已知问题吗?有没有一种解决方法,不需要我一遍又一遍地重写同一行?
代码的相关部分如下:
for PIURL in ${ARRAY[*]}
do
HOSTEDDATE=`cURL -s ${PIURL} | strings | egrep -o "CreationDate\(D:[0-9]{6}" | egrep -o "[0-9]{6}"`
FILE=${PIURL##*/}
NAME=${FILE%.*}
#find local file and pull date
LOCALDATE=`ls $NAME* | egrep -o "[0-9]{6}"`
if [[ ${HOSTEDDATE} > ${LOCALDATE} ]]; then
#move old file to "ARCHIVED"
mv $NAME* ARCHIVED/
#download PI file with required name
cURL -L -o ${NAME}_${HOSTEDDATE}.pdf $PIURL
#send e-mail with
mail -s "${NAME} has a new PI" [email protected] <<< "${NAME}_${DATE} has been uploaded to Pulse"
fi
done
答案1
Smart quotes
这是MacOS 中该功能的副作用。要禁用,请应用:
TextEdit
>>Preferences
Smart quotes
取消选中)
或者,限制Smart quotes
为富文本文档仅有的, 申请:
TextEdit
>>Preferences
Smart quotes and dashes in rich text documents only
查看)
最后,如果你想禁用Smart quotes
系统范围内禁用,请参阅:Mavericks(或 TextEdit)中的引号问题
答案2
听起来您的文本编辑器将标准 ASCII 引号更改为一些更奇特的引号。它们的问题是 shell 不考虑除 ASCII 引号之外的任何内容,因此行为会发生变化。
例如普通引号:
$ echo "foo\(bar"
foo\(bar
与奇特的报价:
$ echo “foo\(bar”
“foo(bar”
在第一种情况下,引号保护反斜杠,如果是的话egrep
,反斜杠将保护左括号。在第二种情况下,shell 看不到任何引号,因此它会处理反斜杠,当命令看到它时,反斜杠就会消失,并将egrep
其作为分组构造的开始。
解决方案是修复编辑器以生成 ASCII 引号,或者使用不坚持更改引号的编辑器。