Answers:
在bash中,不会“将参数转换为整数以执行算术”。在bash中,根据上下文,变量将被视为整数或字符串。
要执行算术运算,您应该调用算术扩展运算符$((...))
。例如:
$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3
或通常首选:
$ echo "$((a + 1))"
3
您应该意识到,bash(与ksh93,zsh或yash相对)仅执行整数运算。如果您有浮点数(带小数的数字),那么还有其他工具可以帮助您。例如,使用bc
:
$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14
或者,您可以使用具有浮点运算支持的shell来代替bash:
zsh> echo $((3.14 + 1))
4.14
在中bash
,您可以使用printf -v执行从任何内容到整数的转换:
printf -v int '%d\n' "$1" 2>/dev/null
浮点数将被转换为整数,而任何看起来都不像数字将被转换为0。幂运算将被截断为之前的数字 e
例:
$ printf -v int '%d\n' 123.123 2>/dev/null
$ printf '%d\n' "$int"
123
$ printf -v int '%d\n' abc 2>/dev/null
$ printf '%d\n' "$int"
0
$ printf -v int '%d\n' 1e10 2>/dev/null
$ printf '%d\n' "$int"
1
printf -v
可以通过命令替换来实现:int="$(printf '%d' 123.123 2>/dev/null)"
bash
您使用的是什么版本?
最近开发用于在Linux和OSX环境中运行的bash脚本时出现了类似情况。OSX中一个命令的结果返回一个包含结果代码的字符串。即" 0"
。当然,在以下情况下无法正确测试:
if [[ $targetCnt != 0 ]]; then...
解决方案是将结果强制(即“转换”)为整数,类似于上面的@ John1024回答,以便按预期方式工作:
targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
==
等[[
(也[
称为test
)中进行字符串比较。算术比较有不同的运算符[[ $targetcnt -ne 0 ]]
; 请参见条件表达式下的联机帮助页(或信息)。要专门修剪空格,可以使用不[
带引号的变量扩展[ $targetcnt == 0 ]
来获取默认的单词拆分(未在中完成[[
),但通常这种方法会导致您陷入危险。
关心颜色代码,即使-x
它们不会出现在迹线()中,也可以消除它的原因是,无论您如何打印,应该是数字的字符串都用引号引起来。
$((var+var))
失败之类的操作会失败但是,如果您echo
或printf
两个变量都相同。我不知道此修复程序,因为我只能通过在输出源处禁用颜色代码来修复它。要在跟踪日志中发现它,您将看到分配的有问题的变量,var='0'
尽管它应该只是var=0
sed
如果您不能禁用它)
printf "1 + %s\n" $1 won't do ?