[英]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 "
其中最奇怪的部分是,我可以发誓这个脚本在几天前运行得非常好。
问题不在于 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.