Uso de parâmetros posicionais dentro da definição de função

1

Como usar os parâmetros posicionais que são dados a partir da linha de comando em uma definição de função? porque dentro da definição da função, $ 1 e $ 2 significam os valores que são inseridos nela!

    
por Narayana Shanmukha Venkat 09.03.2018 / 11:21

3 respostas

0

Não está exatamente claro para mim o que você está pedindo, mas o exemplo a seguir pode esclarecer as coisas:

$ cat script
#!/usr/bin/env bash

echo "Global 1st: ${1}"
echo "Global 2nd: ${2}"

f(){
    echo "In f() 1st: ${1}"
    echo "In f() 2nd: ${2}"
}

f "${1}" "${2}"

$ ./script foo bar
Global 1st: foo
Global 2nd: bar
In f() 1st: foo
In f() 2nd: bar
    
por 09.03.2018 / 11:28
3

Os parâmetros posicionais do escopo do chamador não estão disponíveis em uma função. Você precisaria do chamador para passá-los para a função de uma forma ou de outra.

Em bash , isso poderia ser feito com uma matriz (mas tenha cuidado que matrizes diferentes de "$@" in bash começam no indice 0 em vez de 1 (como em ksh , mas ao contrário de todos os outros shells) ).

f() {
  printf 'Caller $1: %s\n' "${caller_argv[0]}"
  printf '    My $1: %s\n' "$1"
}
caller_argv=("$@")
f blah

Ou passe-os além disso:

f() {
  printf 'Caller $1: %s\n' "$2"
  shift "$(($1 + 1))"
  printf 'My $1: %s\n' "$1"
}

f "$#" "$@" blah

Aqui com $1 contendo o número de argumentos posicionais do chamador, então f sabe onde seus próprios argumentos começam.

    
por 09.03.2018 / 11:27
0

Com o bash, você pode usar a variável shell BASH_ARGV

shopt -s extdebug
# create the array BASH_ARGV with the parameter of the script
shopt -u extdebug
# No more need of extdebug but BASH_ARGV is created

f() {
  printf 'Caller $1: %s\n' ${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}
  printf '    My $1: %s\n' "$1"
}
f blah
    
por 09.03.2018 / 19:56