6

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

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

create_some_array
echo ${a[*]}

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

提前致谢

4

5 回答 5

3

如所述,这可以正常工作。它在您的实际代码中不起作用的最可能原因是您碰巧在子外壳中运行它:

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

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

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

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

于 2013-02-12T18:29:23.250 回答
3

当数组中有空格时,这将无法按预期工作:

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

塔塔!

PS: printf "%q " "${a[@]}" 也可以正常工作...

于 2016-11-23T16:04:35.243 回答
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
于 2014-06-07T19:34:15.233 回答
2

嗨,这是我的解决方案:

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

于 2019-04-24T09:49:59.827 回答
0

这两种方法都对我有用shbash

arr1=("192.168.3.4" "192.168.3.4" "192.168.3.3")

strArr=$(removeDupes arr1) # strArr is a string
for item in $strArr; do arr2+=("$item"); done # convert it to an array
len2=${#arr2[@]} # get array length
echo "${len2}" # echo length

eval arr3=("$(removeDupes arr1)") # shellcheck does not like this line and won't suppress it but it works
len3=${#arr3[@]} # get array length
echo "${len3}" # echo length

顺便说一句,removeDupes 函数如下所示:

removeDupes() {
  arg="$1[@]"
  arr=("${!arg}")
  len=${#arr[@]}
  resultArr=()
  # some array manipulation here
  echo "${resultArr[@]}"
}

此答案基于但更好地解释和简化了@Hans 和@didierc 的答案

于 2021-05-20T15:49:26.143 回答