从Bash函数返回数组

问题描述 投票:6回答:4

我正在制作一个bash脚本,我遇到了一个问题。所以,让我说我得到了这个

function create_some_array(){
  for i in 0 1 2 3 .. 10
  do
    a[i]=$i
  done
}

create_some_array
echo ${a[*]}

有什么方法可以让我的工作吗?我搜索了很多,没有找到任何工作。我认为使a[]成为一个全局变量应该可行但我找不到在我的代码中实际工作的东西。有没有办法将数组从函数返回到主程序?

提前致谢

arrays bash function shell return-value
4个回答
3
投票

如所描述的那样工作正常。它在您的实际代码中不起作用的最可能原因是因为您碰巧在子shell中运行它:

cat textfile | create_some_array
echo ${a[*]}

不起作用,因为管道中的每个元素都在子shell中运行,并且

myvalue=$(create_some_array)
echo ${a[*]}

不起作用,因为命令扩展发生在子shell中。


2
投票

您可以为函数创建一个本地数组,然后返回它:

function create_some_array(){
    local -a a=()
    for i in $(seq $1 $2); do
        a[i]=$i
    done
    echo ${a[@]}
}

declare -a a=()

a=$(create_some_array 0 10)

for i in ${a[@]}; do
   echo "i = " $i
done

2
投票

当数组中有空格时,这将无法正常工作:

function create_some_array() {
    local -a a=()
    for i in $(seq $1 $2); do
        a[i]="$i $[$i*$i]"
    done
    echo ${a[@]}
}

更糟糕的是:如果你试图从外面的“a”获得数组索引,那么它就是一个标量:

echo ${!a[@]}

即使作为一个数组赋值也不会有帮助,因为回声线自然会删除引用,并且无法操纵评估顺序以逃避引用:尝试

function create_some_array() {
...
    echo "${a[@]}"
}

a=($(create_some_array 0 10))
echo ${!a[@]}

尽管如此,printf似乎也无济于事:

function create_some_array() {
...
    printf " \"%s\"" "${a[@]}"
}

似乎一方面产生正确的输出:

$ create_some_array 0 3; echo
 "0 0" "1 1" "2 4" "3 9"

但是赋值不适用于另一个:

$ b=($(create_some_array 0 3))
$ echo ${!b[@]}
0 1 2 3 4 5 6 7

所以我的最后一招是做如下的作业:

$ eval b=("$(create_some_array 0 3)")
$ echo -e "${!b[@]}\n${b[3]}"
0 1 2 3
3 9

请稍等!

P.S。:printf“%q”“$ {a [@]}”也可以正常工作......


0
投票

嗨,这是我的解决方案:

show(){
    local array=()
    array+=("hi")
    array+=("everything")
    array+=("well?")
    echo "${array[@]}"
}

for e in $(show);do
    echo $e
done

试试这个代码:https://www.tutorialspoint.com/execute_bash_online.php

© www.soinside.com 2019 - 2024. All rights reserved.