Existe uma maneira de obter os parâmetros posicionais do script de dentro de uma função no bash?

5

As seguintes variáveis são usadas para obter os parâmetros posicionais:

$1, $2, $3, etc.
$@
$#

Mas eles são usados para ambos os parâmetros posicionais do script e os parâmetros posicionais de uma função.

Quando eu uso essas variáveis dentro de uma função, elas me fornecem os parâmetros posicionais da função.

Existe uma maneira de obter os parâmetros posicionais do script de dentro de uma função?

    
por user271680 21.01.2018 / 13:13

3 respostas

7

Não, não diretamente, pois os parâmetros da função os mascaram. Mas no Bash ou no ksh, você poderia simplesmente atribuir os argumentos do script a um array separado e usá-lo.

#!/bin/bash
ARGV=("$@")
foo() {
     echo "number of args: ${#ARGV[@]}"
     echo "second arg: ${ARGV[1]}"
}
foo x y z 

Observe que a numeração da matriz começa em zero, então $1 vai para ${ARGV[0]} etc.

    
por 21.01.2018 / 13:32
5

Outra maneira de obter o param do script com o bash é usar as variáveis do shell BASH_ARGC e BASH_ARGV

#!/bin/bash
shopt -s extdebug
test(){
  echo 'number of element in the current bash execution call stack = '"${#BASH_ARGC[*]}"
  echo 'the script come with '"${BASH_ARGC[$((${#BASH_ARGC[*]}-1))]}"' parameter(s)'
  echo 'the first is '"${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}"
  echo 'there is 2 way to get the parameters of this function'
  echo 'the first is to get $1,...,$n'
  echo '$1 = '"$1"
  echo '$2 = '"$2"
  echo 'the second with the use of BASH_ARGC and BASH_ARGV'
  echo 'this function '"${FUNCNAME[0]}"' come with '"${BASH_ARGC[0]}"' parameter(s)'
  echo 'the second is '"${BASH_ARGV[0]}"
  echo 'the first is '"${BASH_ARGV[1]}"
}
essai(){
  test paramtest1 "$3"
}
essai paramessai1 paramessai2 paramessai3
    
por 21.01.2018 / 17:05
-2

usando o comando shift no shell, você pode acessar todos os parâmetros posicionais conforme mostrado abaixo Os params são deslocados para a esquerda e ocupam a primeira posição

while (("$ #")) Faz   eco $ 1 mudança feito

    
por 22.01.2018 / 00:25