Bash 中有变量值克隆函数吗?如果没有,为什么不呢?

Bash 中有变量值克隆函数吗?如果没有,为什么不呢?

在 PHP 中,可以通过以下方式将一个变量的变量值复制到另一个变量:

$copy = clone $original;

这不是询问有关 PHP 的问题的地方,但我误解了为什么clone在那里添加这个词有帮助,即为什么不只写$copy = $original,也许与 Bash 的比较(如果适用)可以帮助我理解原因。

答案1

我知道这种克隆(复制)可以防止对 Y 的更改影响 X 的原始值。
在 Bash 中这样做的方法是什么?

我对 PHP 不太熟悉,但我猜你想避免在 Python 中出现这样的情况:

>>> a = [1, 2, 3]
>>> b = a
>>> b[1] = 9
>>> b
[1, 9, 3]
>>> a
[1, 9, 3]

这里,创建了一个包含三个数字的列表,在赋值之后b = a,两个名称都引用同一个列表,因此更改一个会更改另一个。

这样的情况在 Bash 中实际上是不可能的,因为没有隐式引用,也没有几乎任何对象可言。如果想要引用变量,则需要显式使用declare -n/typeset -n来创建 nameref 变量,或者使用${!p}间接引用。

另外,您甚至不能像这样复制数组,仅通过引用数组名称,您需要逐个元素地执行此操作。如果a是 Bash 中的数组,$a则仅获取索引 0 处的元素:

$ a=(1 2 3)
$ b=$a
$ declare -p b
declare -- b="1"

赋值后,b只是一个值为 的标量(非数组)变量1

您可以像这样复制数组:

$ a=(1 2 3)
$ b=("${a[@]}")
$ declare -p b
declare -a b=([0]="1" [1]="2" [2]="3")

这只是复制值并用它们创建一个新数组。 (根据我收集的信息,类似于b=[*a]Python,也可能类似于 PHP 。)另外,正如评论中提到的,它会忘记原始索引,如果数组是稀疏的或关联的,这很重要。clone基于另一个关联数组创建关联数组

相关内容