Bash:如何在算术表达式中进行变量扩展?

时间:2009-03-23 11:23:18

标签: bash scripting

尝试编写一个简单的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 "

最奇怪的部分是我可以发誓这一点 几天前,剧本非常顺利。

编辑(14:58):

问题不在于bash脚本,而在于通过TortoiseSVN使用SVN。通过Windows绕行将EOL标记更改为“CR LF”,这导致bash中出现语法错误。设置svn:eol-style -property有助于避免进一步的类似问题。

3 个答案:

答案 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中有错误的数据?