如何在 Bash 中将字符串计算为数字?

举报
wljslmz 发表于 2022/07/28 01:08:14 2022/07/28
【摘要】 就像 Linux 中的一切都是文件一样,bash 中的一切都是字符串。 从技术上讲,Bash 中没有数据类型,本质上,Bash 变量只是字符串。 当您尝试在 bash 中进行算术运算时,这会产生问题,...

就像 Linux 中的一切都是文件一样,bash 中的一切都是字符串

从技术上讲,Bash 中没有数据类型,本质上,Bash 变量只是字符串。

当您尝试在 bash 中进行算术运算时,这会产生问题,您尝试添加的数字会给您带来奇怪的结果。

ywmt@wljslmz:~$ sum=3+6
ywmt@wljslmz:~$ echo $sum
3+6

  
 
  • 1
  • 2
  • 3

要在 bash 中将字符串转换为整数,请将它们包装在 $((X)) 中,像这样:

$((string))

  
 
  • 1

如果字符串有一个可识别的数字,它将被视为一个数字,我上面显示的示例可以更正为:

ywmt@wljslmz:~$ sum=$((3+6))
ywmt@wljslmz:~$ echo $sum
9

  
 
  • 1
  • 2
  • 3

您在 $((…)) 中所做的任何事情都被认为是算术运算。

让我们更详细地看一下字符串到数字的转换,以便您可以在 bash 中使用算术计算。

将字符串变量转换为数字

让我们声明一些基本上是字符串的“数字”。

ywmt@wljslmz:~$ a=11
ywmt@wljslmz:~$ b=3

  
 
  • 1
  • 2

您可以检查分配的号码:

ywmt@wljslmz:~$ echo $a
11
vimanyu@wljslmz:~$ echo $b
3

  
 
  • 1
  • 2
  • 3
  • 4

现在让我们尝试将两个数字相加并将值存储在第三个变量中c:

ywmt@wljslmz:~$ c=$a+$b
ywmt@wljslmz:~$ echo $c
11+3

  
 
  • 1
  • 2
  • 3

正如您在上面的输出中看到的,c 也被视为字符串。

要使加法成功,您需要通过算术展开“转换”它:

ywmt@wljslmz:~$ c=$(($a+$b))
ywmt@wljslmz:~$ echo $c
14

  
 
  • 1
  • 2
  • 3

请注意,c它实际上仍然是一个字符串,直到您再次隐式使用相同的算术扩展来进行我稍后将讨论的另一个操作。

ywmt@wljslmz:~$ c=$((5))

  
 
  • 1

以上等价于:

ywmt@wljslmz:~$ c=5

  
 
  • 1

d让我们为另一个操作使用第三个变量:

ywmt@wljslmz:~$ d=10

  
 
  • 1

所有这些隐式声明仍然是字符串。这与我之前定义的方式a相同b。

现在进行第二次操作:

ywmt@wljslmz:~$ e=$(($a+$b*$c-$d))
ywmt@wljslmz:~$ echo $e
16

  
 
  • 1
  • 2
  • 3

在上面的表达式中,首先计算 b 和 c 的乘积,最后计算加法和减法。

正如我之前提到的,您在 $((…)) 之间所做的任何事情都被认为是算术运算。

所有这些转换都适用于整数。它不适用于浮点数,即带小数点的数字。

尝试混合实际的字符串和数字

混合字符串和整数仍然比混合可乐和薄荷更安全。不过,它确实会产生一个奇怪的结果。

ywmt@wljslmz:~$ sum=$((3+hello))
ywmt@wljslmz:~$ echo $sum
3

  
 
  • 1
  • 2
  • 3

它仅在有数字(作为字符串)时才有效,如果是纯字符串,就不会神奇地转换成一些数字,相反,它会被忽略,如您在上面的示例中所见。

替代方法:使用 expr

您也可以使用该expr工具进行评估,但请注意它不是“本机” Bash 程序,因为您需要coreutils安装(默认情况下在 Ubuntu 上)作为单独的包。

ywmt@wljslmz:~$ expr $a + $b \* $c - $d
16

  
 
  • 1
  • 2

文章来源: blog.csdn.net,作者:wljslmz,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_43025343/article/details/124334440

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。