Como passar argumentos para funcionar em um script bash? [duplicado]

6
Estou começando / tentando aprender um pouco de script bash e estou querendo saber o que está errado com o meu método de passar argumentos para uma função do terminal (veja abaixo) como o meu método parece semelhante a muitos encontrados na internet tutoriais.

#!/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 =
    
por MarkMark 12.04.2018 / 16:13

3 respostas

13

Você está executando a função addition_example sem argumentos. Portanto, as variáveis $1 e $2 estão vazias e o que você está realmente executando é apenas result = $((+)) . Isso dá exatamente o erro que você mencionou:

$ result = $((+))
bash: +: syntax error: operand expected (error token is "+")

Quando você executar source script_name.sh 20 20 , o shell fornecerá script_name.sh , passando 20 e 20 como argumentos. No entanto, script_name.sh na verdade não contém nenhum comando, ele possui apenas uma declaração de função. Então os argumentos são ignorados. Em seguida, em um comando subseqüente, você executa addition_example , mas sem argumentos, para obter 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:

function addition_example(){
    result=$(($1+$2))
    echo "Addition of the supplied arguments = $result"
}

E, em seguida, execute a função com os argumentos desejados:

$ source script_name.sh; addition_example 20 20
Addition of the supplied arguments = 40
    
por 12.04.2018 / 16:21
6

Você tem alguns pequenos problemas com o código.

Tente isto:

#!/bin/bash

function addition_example(){
    local num1=$1
    local num2=$2
    local result=$((num1+num2))
    echo "Addition of the supplied arguments = $result"
}
addition_example "$1" "$2"
  • A função estava sendo declarada no script, mas quando você simplesmente executa o script, ela não executaria a função.
  • Os argumentos passados para o script (como parâmetros posicionais) não serão passados para a função, a menos que especificado.
  • Você não pode ter espaços em torno do = na atribuição de variável com o bash
  • Sua declaração echo deve ser citada, qualquer variável deve ser citada.
por 12.04.2018 / 16:18
2

Existem vários problemas com o script.

Use o Shellcheck

Alguns podem ser detectados usando o shellcheck.net . O primeiro problema que mostra é:

In dd line 4:
result = $(($1+$2))
       ^-- SC1068: Don't put spaces around the = in assignments.

Citar variáveis

Você tem uma expansão variável sem aspas. Você deve citar todas as expansões variáveis, a menos que você realmente queira que glob & operações de divisão são necessárias. Altere a linha de eco para:

echo "Addition of the supplied arguments = $result"

Não use a função e () ao mesmo tempo

A definição da função pode ser uma destas linhas:

function add { 
add () {

O segundo método é mais portátil (executado em mais shells).

Chame a função com argumentos

Existem dois métodos para fornecer parâmetros para a função.

Fonte (não recomendado)

Você pode criar o script dentro do seu shell interativo atual:

$ source ./script_name.sh
$ addition_example 20 20
Addition of the supplied arguments = 40

Não use $20 , pois o $ é um caractere reservado para o shell. Ele será analisado pelo shell como o segundo parâmetro $2 (no shell atual) e anexará um 0 após ele.

No entanto, isso está mudando o shell em execução com o que está dentro do script. Não é algo que você normalmente quer.

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) execute o código. Se o código é escrito para ser interpretado e executado com um shell específico.

Executa

Tudo que você precisa para realmente executar o script (como deveria ser) é:

  • Torne o script executável chmod u+x script_name.sh
  • Inclua uma linha shebang (você já tem uma)
  • Chame a função.

Roteiro editado

#!/bin/bash

addition_example(){
    result=$(($1+$2))
    echo "Addition of the supplied arguments = $result"
}

addition_example "$@"

E execute como:

$ ./script_name.sh 20 20
Addition of the supplied arguments = 40

O "$@" é expandido para a lista de argumentos fornecida ao script.

Melhore a robustez

Para tornar seu script mais robusto, teste se os argumentos para a função estão vazios (o que imprimirá uma mensagem de erro):

result=$((${1:-0}+${2:-0}))
    
por 13.04.2018 / 03:25