繁体   English   中英

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

[英]Bash: How to do a variable expansion within an arithmetic expression?

在尝试编写一个简单的 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 有助于避免进一步的类似问题。

您的错误消息似乎表明您的数据被 CR 污染了。

")syntax error: invalid arithmetic operator (error token is "

请注意应该在当前行尾之后出现的内容是如何开始的。 这很可能是因为您的错误标记实际上是一个 CR(它是一个回车符 - 一个指示终端将 cursor 放在行首的字符)。 这些字符几乎只被 Windows 机器使用,它们是行尾的一部分。

我将假设您正在使用 windows 机器,并且您的“日期”命令给出了 output 后跟一个“windows”换行符,这实际上是一个 \r\n(回车,换行符)。 $() 总是去除尾随的换行符,这会使 \r 留在最后,从而导致脚本中出现解析问题。

在这里,以下命令会在 UNIX 上产生错误:

$ foo=$'5\r'; echo $((5+foo))
")syntax error: invalid arithmetic operator (error token is "

要解决此问题,您需要删除数据中的 \r。 您可以为此使用参数扩展,或 tr(1)。

$ foo=$'5\r'; echo $((5+${foo//$'\r'}))
10

$ $ foo=$'5\r'; echo $((5+$(tr -d '\r' <<< "$foo")))
10

您可以在算术表达式中省略 $。

所以:

DAYS_TO_WEDNESDAY=$((3 - WEEKDAY))

复制并粘贴您的代码,它工作正常:

$ 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里面有坏数据?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM