怎样在 Bash 中将字符串评估为数字

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

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

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

[email protected]:~$ sum=3+6
[email protected]:~$ echo $sum
3+6

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

$((string))

如果字符串具有可识别的数字,则将其视为数字。 这 example 我上面显示的可以更正为:

[email protected]:~$ sum=$((3+6))
[email protected]:~$ echo $sum
9

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

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

将字符串变量转换为数字

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

[email protected]:~$ a=11
[email protected]:~$ b=3

您可以查看分配的号码:

[email protected]:~$ echo $a
11
[email protected]:~$ echo $b
3

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

[email protected]:~$ c=$a+$b
[email protected]:~$ echo $c
11+3

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

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

[email protected]:~$ c=$(($a+$b))
[email protected]:~$ echo $c
14

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

[email protected]:~$ c=$((5))

以上相当于:

[email protected]:~$ c=5

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

[email protected]:~$ d=10

所有这些隐式声明仍然是字符串。 和我定义的一样 ab 早些时候。

现在进行第二次操作:

[email protected]:~$ e=$(($a+$b*$c-$d))
[email protected]:~$ echo $e
16

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

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

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

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

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

[email protected]:~$ sum=$((3+hello))
[email protected]:~$ echo $sum
3

它仅在有数字(作为字符串)时才有效。 如果是纯字符串,就不会神奇地转换成一些数字。 相反,它会被忽略,正如您在 example 以上。

替代方法:使用 expr

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

[email protected]:~$ expr $a + $b * $c - $d
16

我希望这个快速的小教程可以帮助您评估 bash 字符串作为数字。 如果您有任何问题或建议,请随时在下面发表评测。

相关阅读:

Posted in: LinuxTags: