Estou tentando pesquisar como passar parâmetros em uma função Bash, mas o que surge é sempre como passar parâmetros na linha de comando.
Eu gostaria de passar parâmetros dentro do meu script. Eu tentei:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Mas a sintaxe não está correta, como passar um parâmetro para minha função?
bash
parameters
arguments
Stivlo
fonte
fonte
Respostas:
Existem duas maneiras típicas de declarar uma função. Eu prefiro a segunda abordagem.
ou
Para chamar uma função com argumentos:
A função refere-se a argumentos passados por sua posição (não pelo nome), ou seja, $ 1, $ 2 e assim por diante. $ 0 é o nome do próprio script.
Exemplo:
Além disso, você precisa chamar sua função depois que ela for declarada.
Resultado:
Referência: Guia Avançado de Bash-Scripting .
fonte
function name() {}
. Talvez com um 'enter' antes{}
function
palavra - chave e o()
. Meu objetivo (em um arquivo, não na linha de comando) é aumentar a clareza, não reduzir o número de caracteres digitados, vizfunction myBackupFunction() compound-statement
.function
versão da palavra - chave é uma extensão; o outro formulário funciona em todos os shells compatíveis com POSIX.function
palavra - chave tinha garantias nos antigos shells da família ksh que o introduziram que o bash moderno não honra (nesses shells, asfunction
variáveis foram localizadas por padrão; no bash , isso não). Como tal, seu uso diminui a clareza para quem conhece e pode esperar o comportamento do ksh. Veja wiki.bash-hackers.org/scripting/obsoleteO conhecimento de linguagens de programação de alto nível (C / C ++ / Java / PHP / Python / Perl ...) sugeriria ao leigo que as funções bash deveriam funcionar da mesma maneira que nessas outras linguagens. Em vez disso , as funções bash funcionam como comandos do shell e esperam que os argumentos sejam passados para eles da mesma maneira que se pode passar uma opção para um comando do shell (por exemplo
ls -l
). Com efeito, argumentos de função no bash são tratados como parâmetros posicionais ($1, $2..$9, ${10}, ${11}
etc.). Isso não é surpresa, considerando comogetopts
funciona. Não use parênteses para chamar uma função no bash.( Observação : eu estou trabalhando no Open Solaris no momento.)
Deseja usar nomes para variáveis. Apenas faça isso.
Deseja passar uma matriz para uma função?
Dentro da função, lide com argumentos como este.
Precisa passar um valor e uma matriz, mas ainda usar "$ @" dentro da função?
fonte
Se você preferir parâmetros nomeados, é possível (com alguns truques) realmente passar parâmetros nomeados para funções (também possibilita passar matrizes e referências).
O método que desenvolvi permite definir parâmetros nomeados passados para uma função como esta:
Você também pode anotar argumentos como @required ou @readonly, criar ... descansar argumentos, criar matrizes a partir de argumentos sequenciais (usando, por exemplo
string[4]
) e, opcionalmente, listar os argumentos em várias linhas:Em outras palavras, não apenas você pode chamar seus parâmetros pelos nomes (o que compõe um núcleo mais legível), como também pode transmitir matrizes (e referências a variáveis - esse recurso funciona apenas no bash 4.3)! Além disso, as variáveis mapeadas estão todas no escopo local, assim como $ 1 (e outras).
O código que faz esse trabalho é bastante leve e funciona tanto no bash 3 quanto no bash 4 (essas são as únicas versões com as quais eu testei). Se você estiver interessado em mais truques como esse que tornam o desenvolvimento com o bash muito mais agradável e fácil, você pode dar uma olhada no meu Bash Infinity Framework , o código abaixo está disponível como uma de suas funcionalidades.
fonte
@var
,@reference
,@params
variáveis? O que devo procurar na internet para saber mais sobre isso?ucommon
e meu código. É possível que você tenha alguma ferramenta instalada que cause o problema mencionado, sem ideia do que poderia ser.Perca as parênteses e vírgulas:
e a função deve ficar assim:
fonte
Espero que este exemplo possa ajudá-lo. Ele pega dois números do usuário, os alimenta com a função chamada
add
(na última linha do código) eadd
os soma e os imprime.fonte
Um exemplo simples que limpará durante a execução do script ou dentro do script ao chamar uma função.
fonte
Pensei em entrar com menção de outra maneira de passar parâmetros nomeados para bash ... passando por referência. Isso é suportado no bash 4.0
Uma sintaxe alternativa para o bash 4.3 está usando um nameref
Embora o nameref seja muito mais conveniente, pois desreferencia perfeitamente, algumas distros suportadas mais antigas ainda enviam uma versão mais antiga, por isso ainda não a recomendarei.
fonte