在 bash 中,所有变量都作为字符串存储在内存中吗?

use*_*325 14 bash

假设我创建了以下变量:

s=John
i=12345
f=3.14
Run Code Online (Sandbox Code Playgroud)

所有这些变量都是作为字符串存储在内存中的,还是bash有其他数据类型?

小智 16

Bash 变量是无类型的。

与许多其他编程语言不同,Bash 不按“类型”分隔其变量。本质上,Bash 变量是字符串,但是,根据上下文,Bash 允许对变量进行算术运算和比较。决定因素是变量的值是否只包含数字。

作为另一个回答说,有一种弱形式打字的declare。

这是某些编程语言中可用的类型 [1] 的一种非常弱的形式。

看一个例子:

declare -i number
# The script will treat subsequent occurrences of "number" as an integer.     

number=3
echo "Number = $number"     # Number = 3

number=three
echo "Number = $number"     # Number = 0
# Tries to evaluate the string "three" as an integer.
Run Code Online (Sandbox Code Playgroud)

参考:


ilk*_*chu 13

Bash 本质上具有普通的标量变量、数组和关联数组。此外,标量可以使用declare内置. 从脚本程序员/shell 用户的角度来看,字符串变量充当字符串,整数变量充当整数,而数组则对应于它们的类型。内部实现不是很相关。


但是,如果我们想知道数据实际上是如何存储在内存中的,我们必须检查源代码以了解程序实际做了什么。

在 Bash 4.4 中,标量存储为字符串,与整数标签无关。这在/ typedef的定义struct variableSHELL_VAR和函数中make_variable_value可见,该函数将整数显式转换为字符串以进行存储。

数组存储在看起来像链表 ( array.h) 的地方,关联数组存储在哈希表中。其中的值再次存储为字符串。为数组选择链表可能看起来很奇怪,但由于数组可能是稀疏的,并且无论数组包含多少元素,索引都可以是任意数字,因此这种设计选择更容易理解。

但是,该代码还包含未使用union _value的定义,其中包含整数、浮点数和字符串值的字段。它在注释中被标记为“为了未来”,因此 Bash 的某些未来版本可能会以其原生形式存储不同类型的标量。