我是shell脚本的新手,
我想传递两个字符串数组作为参数,并想在函数中访问它以进行进一步的操作。
请帮我一下。
谢谢。
当您将一个或数组传递给函数时,它实际上将每个元素作为参数传递。您可以从$@
中检索所有数组
如果您知道每个数组的大小,则可以按大小对其进行拆分。否则,您需要一些棘手的方法来拆分数组。例如,传递另一个永远不会出现在这些数组中的参数
这是一个例子。
#!/bin/bash
func()
{
echo "all params: $@"
echo "para size: ${#@}"
p1=()
p2=()
i=1
for e in "${@}" ; do
if [[ "$e" == "|" ]] ; then
i=$(($i+1))
continue
fi
if [ $i -eq 1 ] ; then
p1+=($e)
else
p2+=($e)
fi
done
echo "p1: ${p1[@]}"
echo "p2: ${p2[@]}"
}
a=(1 2 3 4 5)
b=('a' 'b' 'c')
func "${a[@]}" "|" "${b[@]}"
这是脚本的输出。
$ ./test.sh
all params: 1 2 3 4 5 | a b c
para size: 9
p1: 1 2 3 4 5
p2: a b c
Bash在处理数组传递给函数方面并不出色,但它是可以做到的。您需要传递4个参数:number-of-elements-array1
array1
number-of-elements-array2
array2
。例如,你可以做:
#!/bin/bash
myfunc() {
local nelem1=$1 ## set no. elements in array 1
local -a array1
local nelem2
local -a array2
shift ## skip to next arg
while ((nelem1-- != 0)); do ## loop nelem1 times
array1+=("$1") ## add arg to array1
shift ## skip to next arg
done
nelem2=$1 ## set no. elements in array 2
shift ## ditto for array 2
while ((nelem2-- != 0)); do
array2+=("$1")
shift
done
declare -p array1 ## output array contents
declare -p array2
}
a1=("My dog" "has fleas")
a2=("my cat" has none)
myfunc ${#a1[@]} "${a1[@]}" ${#a2[@]} "${a2[@]}"
示例使用/输出
$ bash scr/tmp/stack/function-multi-array.sh
declare -a array1=([0]="My dog" [1]="has fleas")
declare -a array2=([0]="my cat" [1]="has" [2]="none")