Estou começando / tentando aprender um pouco de script bash e estou me perguntando o que há de errado com meu método de passar argumentos para uma função do terminal (veja abaixo), pois meu método parece semelhante a muitos encontrados em tutoriais na Internet.
#!/bin/bash
function addition_example(){
result = $(($1+$2))
echo Addition of the supplied arguments = $result
}
Eu chamo o script da seguinte forma:
source script_name.sh "20" "20"; addition_example
Isso retorna o seguinte:
bash: +: syntax error: operand expected (error token is "+")
Eu também tentei:
addition_example "$20" "$20"
Isso retorna o seguinte:
bash: result: command not found
Addition of the supplied arguments =
Você está executando a
addition_example
função sem argumentos. Portanto, as variáveis$1
e$2
estão vazias e o que você está realmente executando é apenasresult = $((+))
. Isso dá exatamente o erro que você mencionou:Quando você executar
source script_name.sh 20 20
, o shell irá sourcescript_name.sh
, passando-o20
e20
como argumentos. No entanto,script_name.sh
na verdade não contém nenhum comando, apenas uma declaração de função. Portanto, os argumentos são ignorados. Em seguida, em um comando subsequente, você executa,addition_example
mas sem argumentos, obtendo o erro descrito acima.Além disso, você tem um erro de sintaxe. Você não pode ter espaços ao redor do operador de atribuição (
=
) em scripts de shell. Você deve alterar seu script para:E então execute a função com os argumentos desejados:
Você tem alguns problemas menores com o código.
Tente isto:
=
atribuição de variável com bashecho
declaração deve ser citada, qualquer variável deve ser citada.Existem vários problemas com o script.
Usar Shellcheck
Alguns podem ser detectados usando shellcheck.net . O primeiro problema que mostra é:
Variáveis de cotação
Você tem uma expansão variável sem aspas. Você deve citar todas as expansões variáveis, a menos que realmente queira que as operações glob & split sejam necessárias. Altere a linha de eco para:
Não use a função e () ao mesmo tempo
A definição da função pode ser qualquer uma destas linhas:
O segundo método é mais portátil (roda em mais shells).
Chame a função com argumentos
Existem dois métodos para fornecer parâmetros à função.
Fonte (não recomendado)
Você pode obter o script dentro do seu shell interativo atual:
Não use
$20
porque$
é um caractere reservado para o shell. Ele será analisado pelo shell como o segundo parâmetro$2
(no shell atual) e anexado a0
ele.No entanto, isso está alterando o shell em execução com o que está dentro do script. Não é algo que você normalmente deseja.
Além disso, o fornecimento de um script não faz uso da linha shebang (a primeira linha do script). Isso permitirá que qualquer shell em execução no shell interativo (sh,ksh,bash,zsh) realmente execute o código. Se o código for escrito para ser interpretado e executado com um shell específico.
Execute
Tudo o que você precisa para realmente executar o script (como deveria ser) é:
chmod u+x script_name.sh
roteiro editado
E execute como:
O
"$@"
get é expandido para a lista de argumentos fornecidos ao script.Melhorar a robustez
Para deixar seu script mais robusto, teste se os argumentos da função estão vazios (o que imprimirá uma mensagem de erro):