首页 > 解决方案 > 语法错误意外的令牌 bash 脚本

问题描述

我在我的 bash 脚本中遇到了一些这样的错误。我是语言新手。任何指针?

#!/bin/bash
echo "Calculating the value V for all given values"
inflation=(0 0.03 0.05)
tax_rate=(0 0.28 0.35)
for I in inflation
do
        for R in tax_rate
        do
                V=(4000*((1+0.07*(1-R))/(1+I))^10)
                echo -n "$V "

        done

done

这是我的输出:

计算所有给定值的值 V ./investment.sh:第 9 行:意外标记附近的语法错误(' ./investment.sh: line 9: V=(4000*((1+0.07*(1-R))/(1+I))^10)' ./investment.sh:第 12 行:意外标记done' ./investment.sh: line 12: 完成附近的语法错误

标签: bash

解决方案


  1. 总是测试你的代码到https://shellcheck.net的错误(你有太多的do语句)
  2. bash无法自行计算浮点数,请改用bc 1]
  3. 做算术替换,使用$(( ))
  4. 做算术,不用算术替换,使用(( ))形式
  5. UPPER CASE 变量为系统保留,最好使用小写
  6. inflation=(0 0.03 0.05)是一个数组,你可以通过"${inflation[@]}"
  7. 引用变量![2]

[1]

bc <<< "scale=2; (4000*((1+0.07*(1-$r))/(1+$i))^10)"

[2] 学习如何在 shell 中正确引用,这很重要:

“双引号”每个包含空格/元字符和每个扩展的文字:"$var", "$(command "$var")", "${array[@]}", "a & b". 用于'single quotes'代码或文字$'s: 'Costs $5 US', ssh host 'echo "$HOSTNAME"'. 见
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words

命令替换: "$(cmd "foo bar")" 导致命令 'cmd' 使用参数 'foo bar' 执行,并且 "$(..)" 将被替换为输出。请参阅http://mywiki.wooledge.org/BashFAQ/002http://mywiki.wooledge.org/CommandSubstitution

$((...))是算术代换。完成算术运算后,整个事情都被表达式的值所取代。见http://mywiki.wooledge.org/ArithmeticExpression

((...))是一个算术命令,如果表达式非零,则返回退出状态 0,如果表达式为零,则返回 1。如果需要副作用(分配),也用作“让”的同义词。

最后

#!/bin/bash
  
echo "Calculating the value v for all given values"
inflation=(0 0.03 0.05)
tax_rate=(0 0.28 0.35)
for i in "${inflation[@]}"; do
    for r in "${tax_rate[@]}"; do
        v="$(bc <<< "scale=2; (4000*((1+0.07*(1-$r))/(1+$i))^10)")"
        echo -n "$v "
    done
done
echo

输出

Calculating the value v for all given values
7840.00 6480.00 5920.00 5360.00 4400.00 4000.00 4400.00 4000.00 3600.00

推荐阅读