【发布时间】:2017-07-11 21:24:28
【问题描述】:
如果我在 bash shell 中定义一个数组:
a=()
a+=("A")
a+=("B")
a+=("C")
我可以按预期与之交互:
echo "${a[0]}"
# Returns "A"
echo "${a[1]}"
# Returns "B"
但是当我通过一个函数运行同一个数组时,我一定是做错了什么。首先,我将定义我的函数:
function sort_array {
declare -a array=("${!1}")
local sorted=()
sorted+=("1")
sorted+=("2")
sorted+=("3")
echo "${sorted[@]}"
}
现在让我们调用它并检查结果:
b=()
b=$(sort_array a[@])
echo "${b[0]}"
# Returns "1 2 3"
# But I'm expecting b[0] == 1
我做错了什么?我意识到我的示例可以完全删除函数参数,但我的最终目标是编写一个 bash sort_array() 函数,我可以将一个数组传递给该函数并取回一个数组。
【问题讨论】:
-
返回的是函数内部的回显,而不是
b的结果...返回空。 -
在函数调用之后添加
b=($b)会得到预期的结果。对数组变量的字符串赋值只会将该值放在第一个索引中。 -
@hbagdi 做到了!我最终将分配更改为
b=($(sort_array a[@]))。如果您想将其发布为答案,我会接受。 -
这通常不起作用;它将一个包含空格的元素拆分为多个元素,这通常违背了使用数组的目的。
-
我已经多次阅读了这个问题和下面的答案,但是有一些事情让我很困扰......在所有提出的解决方案中,最终排序的数组与传入的原始数组完全无关? ?此外,也没有任何类型的排序。似乎每个人都在研究如何仅在 bash 中传递数组。 chepner 确实至少与原始数组有关,但所有其他解决方案,同时将初始数组设置为传入的数组,然后创建另一个完全没有关系的数组并返回它
标签: arrays bash function shell