我想将数组传递给函数并通过它进行循环。
is_node ${nodes[@]}
如果我尝试循环播放
function is_node(){
for role in "${1[@]}"
do
我收到以下错误:
不良替代
如果我第一次尝试检查参数的数量,我会发现有多个。
function is_node(){
if [[ $# -ne 1 ]] then
echo "Error - The number of arguments is not correct. 1 argument(a role name) needed"
我想像一个参数一样传递数组,并在之后传递其他参数
is_node array status limit
然后在函数循环内通过它。
答案 0 :(得分:1)
该问题完全正确,不要认为它与Passing arrays as parameters in bash.重复
在这种情况下,将数组作为参数传递给函数为"${nodes[@]}"
或${nodes[@]}
的问题将在接收端,数组内容未保持完整,因为数组的内容在调用函数之前被扩展。因此,当参数在接收方解压缩时,它们将在$1
,$2
处拆分,直到数组大小为止。您可以从这个简单的示例中看到它,
set -x
newf() { echo "$1"; echo "$2"; echo "$3"; }
arr=(1 2 3)
newf "${arr[@]}"
+ newf 1 2 3
+ echo 1
1
+ echo 2
2
+ echo 3
3
正如您所看到的,当打算使用数组时,数组arr
被扩展到位置参数列表。
因此,鉴于此问题,并声称在数组之后还有其他参数标志,您需要在接收方确定如何开始处理数组后的参数。最好的方法是使用*
传递数组扩展,以便将元素引用为一个整体。
因此,假设您的函数需要3个参数,则可以如下定义。接收器上的read
命令会将整个数组内容字符串拆分为单个元素,并将其存储在数组arrayArgs
中,您可以根据需要对其进行解析。
is_node(){
(( $# < 3 )) && { printf 'insufficient args provided' >&2; return 1; }
read -ra arrayArgs <<<"$1"
printf 'Printing the array content \n'
for element in "${arrayArgs[@]}"; do
printf '%s\n' "$element"
done
printf '2nd arg=%s 3rd arg=%s\n' "$2" "$3"
}
并将数组作为
传递list=(1 2 3)
is_node "${list[*]}" 4 5
答案 1 :(得分:0)
我假设您想同时使用两个参数编写函数-数组和传统的“单个”参数。如果我弄错了,请告诉我。
我的解决方案:
#!/bin/bash
function_with_array_and_single_argument () {
declare -a _array1=("${!1}")
echo "${_array1[@]}"
echo $2
}
array="a
b
c"
function_with_array_and_single_argument "array[@]" "Szczerba"
输出:
$ ./script.sh
a
b
c
Szczerba
答案 2 :(得分:0)
您可以按自己喜欢的任何方式传递参数列表。该函数的参数只是"$@"
。
is_node(){
for role in "$@"; do
: something with "$role"
done
}
is_node "${nodes[@]}"
还请注意正确使用引号,并省略(仅在此处提供的)免费的Bash关键字function
。
更切地讲,如果您未传递令牌的显式列表,则外壳将假设in "$@"
,因此可以(稍微模糊)将其简化为for role; do
如果您有固定数量的其他参数,只需将它们放在可变长度的参数列表之前。