对于base来说价值太大了(错误令牌是" 3pplicationDesktop")

时间:2014-08-17 06:24:52

标签: bash

我的简单bash程序给出了标题中所述的错误。

#!/bin/sh

num1=$1
whatOperator=$2
num2=$3

echo Answer: $(($num1$whatOperator$num2))

我尝试过添加10#

echo Answer: $((10#$num1$whatOperator$num2))

正如我所看到的那样,但是它给出了这个错误:

value too great for base (error token is "10#3ApplicationsDesktop")

我想知道是否有人知道我的问题是什么以及如何解决它!

4 个答案:

答案 0 :(得分:0)

尝试在:

之间添加空格
echo "Answer: $(($num1 $whatOperator $num2))"

只允许整数。您可以使用的运算符是:

    **              exponentiation
    *, /, %         multiplication, division, remainder
    +, -            addition, subtraction
    <<, >>          left and right bitwise shifts
    <=, >=, <, >    comparison
    ==, !=          equality, inequality
    &               bitwise AND
    ^               bitwise XOR
    |               bitwise OR
    &&              logical AND
    ||              logical OR

请参阅help let

  

我设法解决了我的问题但是,我不知道为什么它被解决了。

     

calc 3 * 3

     

给出错误但是如果我输入

     

calc 3 * 3

     

效果很好。

因为*以glob模式扩展(try echo *)而3*3与任何文件都不匹配所以它保持了字面上代码工作的方式。你应该引用glob模式:

calc 3 '*' 3
calc 3 "*" 3
calc 3 \* 3
calc 3 $'*' 3

答案 1 :(得分:0)

我设法解决了我的问题,但是,我不知道它为什么会被修复。

calc 3 * 3

给出错误但是如果我输入

calc 3*3

它完美无缺。 即使我解决了错误,我想知道是否有人知道为什么它被修复。

答案 2 :(得分:0)

应在10#$num1之前添加$num210#在一个整数以0开头的情况下很有用(例如:10#012 = 12,而不是012 = 10)。 但我认为这不是您的问题:查看您提供的错误消息,我很确定变量whatOperatornum2不是您所期望的。

尝试在脚本开头添加set -xv,在结尾添加set +xv;或echo "whatOperator=$whatOperator. and num2=$num2."(用于分隔字符串的点,以便轻松查看是否有换行符)。 我预测whatOperator=Applications. and num2=Desktop.

我会检查脚本的调用。

答案 3 :(得分:0)

扩展@ konsolebox的答案,以下bash函数可能有用:

function [[[ () {
  lhs=$(printf '%07.3f' "$1"); lhs=${lhs/./}
  rhs=$(printf '%07.3f' "$3"); rhs=${rhs/./}
  case "$2" in
    -lt) return $(( 10#$lhs < 10#$rhs )) ;;
    -le) return $(( 10#$lhs <= 10#$rhs )) ;;
    -eq) return $(( 10#$lhs == 10#$rhs )) ;;
    -ge) return $(( 10#$lhs >= 10#$rhs )) ;;
    -gt) return $(( 10#$lhs > 10#$rhs )) ;;
  esac
}

用法可能类似于:

n=0.83
if [[[ $n -gt 1 ]]]; then
  # do something
fi

请注意,将忽略尾随]]]