Uma função não pode afetar os parâmetros posicionais de seu chamador. Isso ocorre por design: parâmetros posicionais são destinados a serem particulares para a função.
Faça sua função funcionar em uma matriz.
myfunction () {
local _myfunction_arrayname=$1
shift
… # work on the positional parameters
eval "$_myfunction_arrayname=(\"\$@\")"
}
myfunction foo "$@"
set -- "${foo[@]}"
No ksh93 e no bash, há uma maneira indireta de fazer algo que se aproxime combinando um alias e o .
( source
) embutido com uma substituição de processo. Exemplo .
alias myfunction='. <(echo myfunction_body \"\$@\"; echo set -- "\"\${new_positional_parameters[@]}\"")'
Coloque a parte do trabalho da função em myfunction_body
e defina a matriz new_positional_parameters
. Após uma chamada para myfunction
, os parâmetros posicionais são definidos para os valores que myfunction_body
coloca em new_positional_parameters
.