Criando uma função que exibe o nome de uma variável e seu valor

7

Eu quero escrever a função (vamos chamá-lo de superEcho) que usa um nome de variável como entrada. A função deve imprimir o nome dessa variável e seu valor

function superEcho
{
     echo "$1: ?????"
}

var=100

superEcho var

Eu quero que este script retorne

var: 100

Mas eu não sei o que devo colocar em vez de "?????" na função superEcho.

    
por Biedrona 10.03.2017 / 11:19

2 respostas

7

POSIXly:

superEcho() {
  eval 'printf "%s\n" "$1: ${'"$1"'}"'
}

Assim como o bash -specific ${!var} , que espera que $1 tenha sido limpo e contenha um nome de variável válido. Caso contrário, isso equivale a uma vulnerabilidade de injeção de comando arbitrária.

Você pode fazer a sanitização na função:

superEcho() {
  case $1 in
    ("" | *[!_0-9abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]* | [0-9]*)
      printf >&2 'Invalid variable name: "%s"\n' "$1"
      return 1;;
    (*) eval 'printf "%s\n" "$1: ${'"$1"'}"'
  esac
}

Note que para variáveis do tipo array ou array associativo , em bash ou ksh (POSIX sh não tem array exceto "$@" que você não poderia usar aqui como isso seria os argumentos da função superEcho propriamente dita) que somente imprime o valor do elemento de indice 0 , enquanto em zsh , que produziria a concatenação dos valores com o primeiro caractere de $IFS (e com caracteres SPC em yash ).

Em ksh , zsh , bash ou yash (as 4 shells parecidas com Bourne com suporte à matriz). Veja também typeset -p var para imprimir a definição e os atributos de uma variável.

    
por 10.03.2017 / 12:07
2

Use ${!variablename} :

function superEcho
{
    printf '%s: %s\n' "$1" "${!1}"
}
    
por 10.03.2017 / 12:03