在尝试编写一个简单的bash脚本来帮助我的部署过程时,我遇到了一个令人困惑的错误:
#!/bin/bash WEEKDAY=$(date +'%u') echo $WEEKDAY DAYS_TO_WEDNESDAY=$((3-$WEEKDAY)) echo $DAYS_TO_WEDNESDAY
结果是:
1 ")syntax error: invalid arithmetic operator (error token is "
其中最奇怪的部分是,我可以发誓,这个剧本几天前运行得很好.
问题不在于bash脚本,而在于通过TortoiseSVN使用SVN.通过Windows绕行将EOL标记更改为"CR LF",这导致bash中出现语法错误.设置svn:eol-style -property有助于避免进一步的类似问题.
您的错误消息似乎表明您的数据被CR污染.
")syntax error: invalid arithmetic operator (error token is "
注意在你的线的当前结束之后应该发生的东西是如何开始的.这很可能是因为您的错误令牌实际上是CR(这是一个回车符 - 一个指示终端将光标放在行首的字符).这些字符几乎只用于Windows机器,它们是行结束的一部分.
我将假设您正在使用Windows机器,并且您的"日期"命令给出了输出,后跟"windows"换行符,实际上是\ r \n(回车符,换行符).$()总是删除尾随的换行符,最后留下\ r \n导致脚本中的解析问题.
这里,以下命令在UNIX上产生错误:
$ foo=$'5\r'; echo $((5+foo)) ")syntax error: invalid arithmetic operator (error token is "
要解决此问题,您需要删除数据中的\ r \n.您可以为此使用参数扩展,或tr(1).
$ foo=$'5\r'; echo $((5+${foo//$'\r'})) 10 $ $ foo=$'5\r'; echo $((5+$(tr -d '\r' <<< "$foo"))) 10