尝试编写一个简单的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有助于避免进一步的类似问题。
答案 0 :(得分:6)
您的错误消息似乎表明您的数据受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
答案 1 :(得分:2)
您可以在算术表达式中省略$。
所以:
DAYS_TO_WEDNESDAY=$((3 - WEEKDAY))
答案 2 :(得分:1)
复制并粘贴您的代码,工作正常:
$ cat > test.sh
#!/bin/bash
WEEKDAY=$(date +'%u')
echo $WEEKDAY
DAYS_TO_WEDNESDAY=$((3-$WEEKDAY))
echo $DAYS_TO_WEDNESDAY
^D
$ bash test.sh
1
2
也许$WEEKDAY
中有错误的数据?