Parâmetros posicionais do chamador da função

5

Eu preciso ler e escrever os parâmetros posicionais $@ do chamador de uma função. A página man do Bash diz que:

A shell function is an object that is called like a simple command and executes a compound command with a new set of positional parameters

Portanto, $@ é reescrito em todas as chamadas. Procurei por algum "parâmetro especial" mas não encontrei nada. A variável de shell BASH_ARGV parece resolver o meu problema, no entanto, ela exige shopt -s extdebug ativado, o que não é o comportamento padrão na minha máquina, nem parece uma opção para ativar na produção.

extdebug
    If set, behavior intended for use by debuggers is enabled:
    ...
    4.     BASH_ARGC and BASH_ARGV are updated as described in their
           descriptions above.
    ...

Bash é capaz de ler ou escrever o chamador de uma função $@ sem BASH_ARGV ? Você acha que o Bash é limitado e usa outro shell para scripts?

Editar: Eu quero um wrapper de fantasia getopt dentro da minha biblioteca de ajuda. Então, todo comportamento relacionado a ele vai dentro de uma função. Não há necessidade de verificar erros ou set -- .

    
por Pedro Lacerda 12.10.2012 / 04:11

2 respostas

1

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 .

    
por 15.10.2012 / 01:02
0

Veja alguns códigos que percorrem os parâmetros, atualizando cada um deles conforme necessário . Neste caso, substituindo barras duplicadas por uma única:

for param
do
    param="$(printf %s. "$1" | tr -s "/")"
    set -- "$@" "${param%.}"
    shift
done
    
por 17.10.2012 / 11:54