假设我创建了以下变量:
s=John
i=12345
f=3.14
Run Code Online (Sandbox Code Playgroud)
所有这些变量都是作为字符串存储在内存中的,还是bash有其他数据类型?
小智 16
Bash 变量是无类型的。
与许多其他编程语言不同,Bash 不按“类型”分隔其变量。本质上,Bash 变量是字符串,但是,根据上下文,Bash 允许对变量进行算术运算和比较。决定因素是变量的值是否只包含数字。
作为另一个回答说,有一种弱形式打字的declare。
这是某些编程语言中可用的类型 [1] 的一种非常弱的形式。
看一个例子:
Run Code Online (Sandbox Code Playgroud)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.
参考:
ilk*_*chu 13
Bash 本质上具有普通的标量变量、数组和关联数组。此外,标量可以使用declare内置. 从脚本程序员/shell 用户的角度来看,字符串变量充当字符串,整数变量充当整数,而数组则对应于它们的类型。内部实现不是很相关。
但是,如果我们想知道数据实际上是如何存储在内存中的,我们必须检查源代码以了解程序实际做了什么。
在 Bash 4.4 中,标量存储为字符串,与整数标签无关。这在/ typedef的定义struct variableSHELL_VAR和函数中make_variable_value可见,该函数将整数显式转换为字符串以进行存储。
数组存储在看起来像链表 ( array.h) 的地方,关联数组存储在哈希表中。其中的值再次存储为字符串。为数组选择链表可能看起来很奇怪,但由于数组可能是稀疏的,并且无论数组包含多少元素,索引都可以是任意数字,因此这种设计选择更容易理解。
但是,该代码还包含未使用union _value的定义,其中包含整数、浮点数和字符串值的字段。它在注释中被标记为“为了未来”,因此 Bash 的某些未来版本可能会以其原生形式存储不同类型的标量。