我有一个代码片段可以在 shell 脚本中打印出一个数组:
for i in "${array[@]}"; do
echo "$i"
done
}
我想用它创建一个函数
printArray() {
for i in "${$1[@]}"; do
echo "$i"
done
}
但是当我用数组名(在 shell 脚本中也可用)调用我的函数时,我得到一个错误: ${$1[@]}:替换错误
我发现花括号先展开,可能是试图按字面意思展开“$1[@]”。
我只找到了数字扩展的答案,比如从 1 到 5。那么是否可以用花括号内的变量替换数组名称?
我希望能够在我的函数中放置一个变量而不是特定的数组名称。
我在以下 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
}
您可以使用
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
。
我是这样做的:
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