【问题标题】:Bash: How to do a variable expansion within an arithmetic expression?Bash:如何在算术表达式中进行变量扩展?
【发布时间】:2009-03-23 11:23:18
【问题描述】:

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

【问题讨论】:

  • 该脚本在这里没有任何错误(我从您的问题中复制/粘贴): $ WEEKDAY=​​$(date +'%u') $ echo $WEEKDAY 1 $ DAYS_TO_WEDNESDAY=$(( 3-$WEEKDAY)) $ echo $DAYS_TO_WEDNESDAY 2

标签: bash scripting


【解决方案1】:

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

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

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

我假设您正在使用 Windows 机器,并且您的“date”命令给出了输出,后跟“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

【讨论】:

    【解决方案2】:

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

    所以:

    DAYS_TO_WEDNESDAY=$((3 - WEEKDAY))
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的信息。我最终重写了剧本,那个剧本做得很好。 hexdump 透露,通过 windows SVN 客户端的绕行添加了 CR LF -EOLs 而不仅仅是 LF:s。
      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 2015-10-27
      • 2011-01-25
      • 2011-01-31
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多