"${@:4}"
funciona para mim no bash. Você também pode atribuir a outra matriz e indexá-la:
foo=("$@")
second_function "${foo[@]:4}"
Estou chamando uma função e quero passar até 100 parâmetros para outra função. Eu não quero passar os 3 primeiros parâmetros, eu começo com o param4 sendo o primeiro parâmetro para o outro programa.
Atualmente estou autorizando a transmissão de até 19 adicionais com
$function_under_test "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}"
"${13}" "${14}" "${15}" "${16}" "${17}" "${18}" "${19}"
mas isso não é muito substanável para conjuntos maiores de parâmetros.
Eu tentei
declare -a pass_on_params
for ((a=2; a<$#; a++)); do
pass_on_params+=(${@[a]}) # line 8
done
echo "->" $pass_on_params
mas eu recebo
do_test.sh: line 8: ${@[a]}: bad substitution
O código completo é:
do_test () {
function_under_test=$1
line_number=$2
expected="$3"
param1="$4"
declare -a pass_on_params
for ((a=2; a<$#; a++)); do
pass_on_params+=(${@[a]})
done
echo "ppppppppp" $pass_on_params
$function_under_test "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}" "${13}" "${14}" "${15}" "${16}" "${17}" "${18}" "${19}"
if [ $result -eq $expected ]; then
printf '.'
else
printf 'F'
error_messages=$error_messages"Call to '$function_under_test $param1' failed: $result was not equal to $expected at line $line_number\n"
fi
}
O shell é bash
Use apenas outra função:
fn(){
pass(){
shift "$shift"
"$other" "$@"
}
other=fn2 shift=3 pass "$@"
unset -f pass
}
Seria melhor, no entanto, iterar os argumentos de uma forma organizada. Como ...
while [ "$#" -gt 0 ]
do : something with "$1"
shift;done
.. ou ..
for arg do : something with "$arg"; done
... mas é difícil dizer o que você está fazendo.
Você pode com segurança eval
uate expressões matemáticas em parâmetros posicionais se você manipular o direito de citar:
eval "fn2 $(i=3
until [ "$#" -le 3 ]
do printf '"${%d}" ' "$((i+=1))"
shift;done
)"
Você quer mudar três vezes e passar $ @
O código completo é:
do_test () {
function_under_test=$1;shift
line_number=$1;shift
expected="$1";shift
echo "ppppppppp" $@
$function_under_test "$@"
if [ $result -eq $expected ]; then
printf '.'
else
printf 'F'
error_messages=$error_messages"Call to '$function_under_test $param1' failed: $result was not equal to $expected at line $line_number\n"
fi
}