花括号内数组名称的变量(在 bash 中传递或打印数组)

问题描述 投票:0回答:3

我有一个代码片段可以在 shell 脚本中打印出一个数组:

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

我想用它创建一个函数

printArray() {
    for i in "${$1[@]}"; do
      echo "$i"
      done
}

但是当我用数组名(在 shell 脚本中也可用)调用我的函数时,我得到一个错误: ${$1[@]}:替换错误

我发现花括号先展开,可能是试图按字面意思展开“$1[@]”。

我只找到了数字扩展的答案,比如从 1 到 5。那么是否可以用花括号内的变量替换数组名称?

我希望能够在我的函数中放置一个变量而不是特定的数组名称。

arrays bash function variables curly-braces
3个回答
0
投票

我在以下 shell 检查中发布了我的代码: https://www.shellcheck.net/

它给了我以下答案: https://www.shellcheck.net/wiki/SC2082

# Expand variable names dynamically
var_1="hello world"
n=1
name="var_$n"
echo "${!name}"

所以我先把数组名展开,然后用感叹号放在花括号里。在此之后错误消失并且数组被打印出来。

printArray() {
    array="$1[@]"
    for i in "${!array}"; do
      echo "$i"
    done
}

0
投票

您可以使用

nameref
属性(在
bash
的 4.3 版中引入),使用
-n
选项到
declare
local
内置命令来完成这项工作:

#!/bin/bash

printArray() {
    if [[ $1 != 'aref' ]]; then
        local -n aref=$1 || return
    fi
    printf '%s\n' "${aref[@]}"
}

echo '*** array=( -n -e -E ); printArray array ***'
array=( -n -e -E ); printArray array

echo '*** aref=( 8 9 10 ); printArray aref ***'
aref=( 8 9 10 ); printArray aref

echo '*** i=( 8 9 10 ); printArray i; declare -p i ***'
i=( 8 9 10 ); printArray i; declare -p i

Bash参考手册
中搜索nameref


0
投票

以下是我如何传递和打印 bash 数组:

按值传递参数打印 bash 数组

arrays_join_and_print.sh 来自我的 eRCaGuy_hello_world 回购:

更新:更好,参见:array_print.sh now,我刚刚写的。 Sourcing(导入)

array_print.sh
通过
. array_print.sh
让您可以直接访问我下面的两个打印功能。

# Function to print all elements of an array.
# Example usage, where `my_array` is a bash array:
#       my_array=()
#       my_array+=("one")
#       my_array+=("two")
#       my_array+=("three")
#       print_array "${my_array[@]}"
print_array() {
    for element in "$@"; do
        printf "    %s\n" "$element"
    done
}

# Usage

# Build an array
array1=()
array1+=("one")
array1+=("two")
array1+=("three")

# Print it
echo "array1:"
print_array "${array1[@]}"

样本输出:

array1:
    one
    two
    three

通过引用传递数组来打印 bash 数组

print_array2() {
    # declare a local **reference variable** (hence `-n`) named `array_ref`
    # which is a reference to the first parameter passed in
    local -n array_ref="$1"

    for element in "${array_ref[@]}"; do
        printf "    %s\n" "$element"
    done
}

# Usage

print_array2 "array1"
# or
print_array2 array1

输出:同上。

更进一步:

为了在 Bash 中将数组作为参数传递,我提出了 3 个也可用于打印数组的解决方案:

  1. [我的最爱]通过引用传递数组(常规数组和关联 bash 数组)
  2. 手动序列化和反序列化数组
  3. 对于关联数组:通过引用传递并手动序列化/反序列化
© www.soinside.com 2019 - 2024. All rights reserved.