从bash函数返回阵列(Returning array from a Bash function)

2019-08-16 22:18发布

我想提出一个bash脚本,我已经遇到了一个问题。 所以我们可以说我得到了这个

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

create_some_array
echo ${a[*]}

有没有什么办法可以使这项工作? 我已经搜索了很多,并没有发现我的工作。 我想制作a[]的全局变量应该工作,但我无法找到的东西,实际工作在我的代码。 有没有办法返回从功能到主程序数组?

提前致谢

Answer 1:

描述这工作得很好。 最可能的原因并不在你的实际代码工作是因为你碰巧在子shell中运行它:

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

是行不通的,因为管道中的每一个元素在子shell中运行,

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

是行不通的,因为命令扩展在子shell中发生的。



Answer 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


Answer 3:

这不会按预期当有数组中的空格:

function create_some_array() {
    local -a a=()
    for i in $(seq $1 $2); do
        a[i]="$i $[$i*$i]"
    done
    echo ${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

TATAAA!

PS:printf的 “%Q” “$ {A [@]}”,也能正常工作?



Answer 4:

你好,这里是我的解决方案:

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



文章来源: Returning array from a Bash function