addOne.sh
:echo + 1
>>sh addOne.sh 1
prints 1 + 1
#1 楼
在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
评论
如果您不知道字符串是什么(例如用户输入),则使用$(())或(())是不安全的。考虑以下情况:foo = foo((foo + = 0))这将导致脚本崩溃,因为它尝试递归评估foo。相同于:foo = foo foo = $((foo + 0))
–art
16年8月5日下午2:00
仅当您知道变量包含有效整数时,此方法才有效。我的答案中有很多测试stackoverflow.com/a/59781257/117471
–布鲁诺·布鲁诺斯基(Bruno Bronosky)
20 Jan 17'5:02
bc #isthashiznit,谢谢你
–jsaddwater
20 Jan 24 '13:26
#2 楼
否则,您可以使用expr
例如:
$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3
评论
如果我在数字后面输入字符,则此崩溃并死亡。我正在尝试测试电池电量百分比。当它低于10时,如果总是因为那个时期而死亡。下面的解决方案效果很好。
–埃里克·塞巴斯塔(Eric Sebasta)
20年8月1日在19:23
@EricSebasta“下面的解决方案”-不要忘记“上方”和“下方”在SO中没有意义,因为答案会四处移动。最好参考帮助您的特定用户。
–楼
20/12/3在10:10
#3 楼
在bash
中,您可以使用printf -v将任何内容转换为整数:printf -v int '%d\n' "" 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的shell中,这可以通过命令替换来实现:int =“ $(printf'%d'123.123 2> / dev / null)”
– AdrianGünter
18年4月13日在19:11
#4 楼
最近,开发可在Linux和OSX环境中运行的bash脚本时出现了类似情况。 OSX中一个命令的结果返回了一个包含结果代码的字符串。即" 0"
。当然,在以下情况下无法正确测试:if [[ $targetCnt != 0 ]]; then...
解决方案是强制(即“转换”)结果为整数,类似于@ John1024在上面回答的内容可以正常运行:
targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
评论
= [等[[(也[aka测试])进行字符串比较。有不同的运算符用于算术比较,例如[[$ targetcnt -ne 0]];请参见条件表达式下的联机帮助页(或信息)。要专门修剪空格,可以使用[加上未加引号的变量扩展[$ targetcnt == 0]来进行默认的单词拆分([[]中未完成),但总的来说,这种方法会使您陷入危险。
–dave_thompson_085
16年8月5日在7:34
评论
我尝试格式化您的问题,但仍不清楚。 printf“ 1 +%s \ n” $ 1不起作用吗?