bash - retorno - validar parametros shell script




Passando parâmetros para uma função Bash (5)

Espero que este exemplo possa ajudar você. Leva dois números do usuário, alimenta-os para a função chamada add (na última linha do código), e add irá resumi-los e imprimi-los.

#!/bin/bash

read -p "Enter the first  value: " x
read -p "Enter the second value: " y

add(){
    arg1=$1 #arg1 gets to be the first  assigned argument (note there are no spaces)
    arg2=$2 #arg2 gets to be the second assigned argument (note there are no spaces)

    echo $(($arg1 + $arg2))
}

add x y #feeding the arguments

Eu estou tentando pesquisar como passar parâmetros em uma função de Bash, mas o que surge é sempre como passar o parâmetro da 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?


Existem duas maneiras típicas de declarar uma função. Eu prefiro a segunda abordagem.

function function_name {
   command...
} 

ou

function_name () {
   command...
} 

Para chamar uma função com argumentos:

function_name "$arg1" "$arg2"

A função refere-se aos 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:

function_name () {
   echo "Parameter #1 is $1"
}

Além disso, você precisa chamar sua função depois que ela for declarada.

#!/usr/bin/env sh

foo 1  # this will fail because foo has not been declared yet.

foo() {
    echo "Parameter #1 is $1"
}

foo 2 # this will work.

Saída:

./myScript.sh: line 2: foo: command not found
Parameter #1 is 2

Referência: Advanced Bash-Scripting Guide .


Pensei em canalizar com menção de outra maneira de passar parâmetros nomeados para bash ... passando por referência. Isso é suportado a partir do bash 4.0

#!/bin/bash
function myBackupFunction(){ # directory options destination filename
local directory="$1" options="$2" destination="$3" filename="$4";
  echo "tar cz ${!options} ${!directory} | ssh [email protected] \"cat > /mnt/${!destination}/${!filename}.tgz\"";
}

declare -A backup=([directory]=".." [options]="..." [destination]="backups" [filename]="backup" );

myBackupFunction backup[directory] backup[options] backup[destination] backup[filename];

Uma sintaxe alternativa para o bash 4.3 está usando um nameref

Embora o nameref seja muito mais conveniente na medida em que faz uma dereferência sem interrupções, algumas distribuições suportadas mais antigas ainda disponibilizam uma versão mais antiga, por isso não vou recomendá-la ainda.


Perca os parênteses e vírgulas:

 myBackupFunction ".." "..." "xx"

e a função deve ficar assim:

function myBackupFunction() {
   # here $1 is the first parameter, $2 the second etc.
}

Um exemplo simples que limpará ambos durante a execução do script ou dentro do script ao chamar uma função.

#!/bin/bash
echo "parameterized function example"
function print_param_value(){
    value1="${1}" # $1 represent first argument
    value2="${2}" # $2 represent second argument
    echo "param 1 is  ${value1}" #as string
    echo "param 2 is ${value2}"
    sum=$(($value1+$value2)) #process them as number
    echo "The sum of two value is ${sum}"
}
print_param_value "6" "4" #space sparted value
#you can also pass paramter durign executing script
print_param_value "$1" "$2" #parameter $1 and $2 during executing

#suppose our script name is param_example
# call like this 
# ./param_example 5 5
# now the param will be $1=5 and $2=5






bash