尝试弄清楚如何将参数转换为整数以对其进行算术运算,然后打印出来,例如对addOne.sh

echo  + 1
>>sh addOne.sh 1
prints 1 + 1


评论

我尝试格式化您的问题,但仍不清楚。 printf“ 1 +%s \ n” $ 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