O que acontece se eu passar poucos parâmetros para uma função de shell?

2

Gostaria de perguntar sobre a passagem de parâmetros para funções. Eu tentei isso:

function_name $var1 $var2

mas geralmente (às vezes, erro impresso) não fazia diferença se eu os passava ou não. Quer dizer, funcionou perfeitamente quando eu chamei apenas com function_name . Então, minha pergunta é: é necessário dar esses parâmetros como no exemplo acima?

    
por applenic 26.03.2015 / 11:55

3 respostas

0

O Bash não verifica o número de argumentos passados para uma função porque não há protótipos como em C. De link :

Shell functions are a way to group commands for later execution using a single name for the group. They are executed just like a "regular" command. When the name of a shell function is used as a simple command name, the list of commands associated with that function name is executed. Shell functions are executed in the current shell context; no new process is created to interpret them.

Functions are declared using this syntax:

name () compound-command [ redirections ]

or

function name [()] compound-command [ redirections ]

Uma verificação interna funciona se um número de argumentos está correto e retorna um erro se não estiver, mas não é responsabilidade do Bash. Veja:

#!/bin/bash

function f()
{
    echo $1
}

function f1
{
    echo $1
}

f
f 2
f1
f1 f1
    
por 26.03.2015 / 12:57
0

Você pode referenciar os argumentos de uma função como expansões numeradas na ordem de sua aparência na linha de comando quando a função foi chamada. Se você deseja exigir que um argumento esteja presente para que uma função funcione, você pode fazer isso através de uma referência de falha intrínseca ao argumento em questão via expansão de parâmetro.

echo1()(
    printf %s\n \
    "${1?This function requires an argument!}"
)

O exemplo acima irá imprimir o valor (se houver) para o primeiro argumento da função seguido por uma nova linha para stdout e retornar 0, ou imprimirá uma mensagem de diagnóstico no formato do seu shell contendo a frase Esta função requer um argumento! para stderr e retorna diferente de 0 se não for fornecido nenhum argumento.

Note que a função é declarada para ser executada em um subshell como:

fn()( : body )

E não no shell atual como:

fn(){ : body; }

Isso ocorre porque o formulário de substituição de parâmetro usado para aumentar o erro faz com que o shell atual saia - e se a função for executada no shell atual, pode resultar em uma saída inesperada do shell atual. Isso só é verdade para shells não-interativos . Por exemplo, se a função foi ou não declarada em um subshell, a função acima deve se comportar de maneira semelhante, de qualquer forma, se chamada a partir de um prompt.

Mas se a função fosse declarada em um shell atual e executada em um script, então o script encerraria a execução como um todo se echo1 fosse chamado sem nenhum argumento.

    
por 27.03.2015 / 08:10
-1

Uma função, como um comando externo, recebe uma lista de parâmetros. Não há como definir uma função que requer intrinsecamente um certo número de parâmetros. O código da função pode verificar o número de parâmetros e seu valor e emitir mensagens de erro, se desejar.

O número de parâmetros passados para a função atual está disponível na variável especial $# . Se você usar um parâmetro numerado maior que o número de parâmetros reais, esse parâmetro não será definido, portanto, se você tentar acessá-lo, obterá uma string vazia. Por exemplo, com a seguinte definição:

f () {
  echo "$#" "[[$2]]"
}
  • f imprime 0 [[]] . Como não há número de parâmetro 2, $2 se expande para a string vazia.
  • f one imprime 1 [[]] pelas mesmas razões.
  • f one two imprime 2 [[two]] .
  • f one two three imprime 3 [[two]] . A função acontece para não fazer nada com seu terceiro parâmetro, mas tudo bem.
por 27.03.2015 / 02:39