我的简单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")
我想知道是否有人知道我的问题是什么以及如何解决它!
答案 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
之前添加$num2
。 10#
在一个整数以0开头的情况下很有用(例如:10#012 = 12,而不是012 = 10)。
但我认为这不是您的问题:查看您提供的错误消息,我很确定变量whatOperator
和num2
不是您所期望的。
尝试在脚本开头添加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
请注意,将忽略尾随]]]
。