Em um shell sh
que não suporta arrays e a palavra-chave local
, você ainda pode usar $@
como uma matriz na função. Você pode escolher os dois primeiros argumentos com shift 2
e depois usar $@
, que agora contém todos os argumentos restantes.
foo () {
arg1=$1
arg2=$2
shift 2 # shift $3 into $1, $4 into $2 etc.
for n in "$@"; do # or just: for n do
printf 'Other argument: %s\n' "$n"
# other code acting on "$n"
done
}
foo "arg1" "arg2" "arg3" "arg4"
Coloque o corpo da função em ( ... )
em vez de { ... }
para tornar todas as variáveis locais, se a função não precisar modificar variáveis globais e você não quiser poluir o espaço de nomes da variável com variáveis desnecessárias. / p>
Usando seus dados originais com foo
declarado como acima:
set -- "component1" \
"component21 component22 component23" \
"component3" \
"component41 component42 component43"
foo "$param1" "$param2" "$@"
Em um shell que suporta arrays e local
, você faria exatamente a mesma coisa (mas a função pode querer usar variáveis declaradas como local
), e a chamada pode ser
foo "arg1" "arg2" "${myarray[@]}"
Para passar várias matrizes em bash
, eu usaria uma referência de nome na função (requer bash
release 4.3 ou posterior):
foo () {
local arg1=$1
local arg2=$2
local -n arr1=$3
local -n arr2=$4
for n in "${arr2[@]}"; do ...; done
}
foo "arg1" "arg2" myarray1 myarray2
Note que você não pode passar uma variável array para a função que tem o mesmo nome da variável de referência do nome correspondente na função (eu considero isso um bug, ela funciona em ksh93
).