Como eu defino a saída de uma função como um valor variável em um script bash?

4

Eu tenho a seguinte função para contar o número de arquivos em um diretório, dentro do meu script bash.

file_count() {
  no_of_files=$(find "" -maxdepth 1 -type f -printf '.' | wc -c)
}

Gostaria de usá-lo repetidamente em diretórios diferentes e salvar a contagem em uma variável para cada diretório. Atualmente para fazer isso, eu uso

file_count $somedir
files_in_somedir="$no_of_files"

Estou ciente de que estou definindo a variável no_of_files fora da função a cada vez e gostaria de torná-la local para a função, e não definir uma variável intermediária no script principal. Isto é apenas no caso de haver algum erro, o que significa que a variável não muda entre as chamadas da função (erro de digitação do nome da função talvez), e o valor antigo de no_of _files é usado.

Se minha função fosse:

file_count() {
  local no_of_files=$(find "" -maxdepth 1 -type f -printf '.' | wc -c)
}

Como eu configuraria facilmente essas variáveis de contagem de diretório?

    
por Arronical 14.09.2016 / 16:57

1 resposta

6

Funções Bash não são como funções em outras linguagens de programação, elas são mais parecidas com comandos. Isso significa que eles não têm valor de retorno clássico, mas

  • um código de saída / retorno. Este é um número inteiro no intervalo 0-255, onde 0 significa "sucesso" e todos os outros valores representam um erro. Se você tentar especificar um número fora desse intervalo, ele será levado ao módulo 256 (adicione ou subtraia 255 do seu número até que ele se ajuste ao intervalo de 0 a 255).

    Este código é automaticamente definido para o código de retorno da última declaração que foi executada dentro da função, a menos que você a defina manualmente usando o comando return , assim:

    return 1
    
  • fluxos de saída. Cada função Bash pode gravar strings arbitrárias nos streams de saída (STDOUT e STDERR), assim como os scripts normais. A saída pode ser diretamente dos comandos que você executa na função ou configurada manualmente usando echo .

    Mas, em vez de permitir que essa saída seja exibida no console, você pode capturá-la quando executar a função, por exemplo, usando a sintaxe de substituição de comandos do Bash e armazene-a em uma variável em seu script principal:

    example_function() {
        # do something useful
        echo "return this message"
    }
    
    returned_value="$(example_function)"
    

Assim, seu código teria que ser assim:

file_count() {
    find "" -maxdepth 1 -type f -printf '.' | wc -c
    # the line above already prints the desired value, so we don't need an echo
}

files_in_somedir="$(file_count "$somedir")"

Consulte Valor de retorno no script bash (no Stack Overflow) para obter mais informações.

    
por Byte Commander 14.09.2016 / 17:45