花括号内数组名称的变量

问题描述 投票: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() {
    [[ $1 ]] || return
    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
投票

我是这样做的:

arrays_join_and_print.sh 来自我的 eRCaGuy_hello_world 回购:

# 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
}

array1=()
array1+=("one")
array1+=("two")
array1+=("three")

echo "array1:"
print_array "${array1[@]}"

样本输出:

array1:
    one
    two
    three
© www.soinside.com 2019 - 2024. All rights reserved.