Come si può ottenere il valore di una variabile dato il suo nome nella Korn shell?

StackOverflow https://stackoverflow.com/questions/870860

  •  22-08-2019
  •  | 
  •  

Domanda

C'è un modo in ksh per ottenere il valore di una variabile quando ti è stato dato il nome della variabile?

Ad esempio:

#!/usr/bin/ksh
var_name=$1  #pretend here that the user passed the string "PATH"
echo ${$var_name}  #echo value of $PATH -- what do I do here?
È stato utile?

Soluzione

var_name=$1  #pretend here that the user passed the string "PATH"
printenv    $var_name

Altri suggerimenti

eval `echo '$'$var_name`

echo concatena un '$' per il nome della variabile interna $ nome_var, eval lo valuta per mostrare il valore.

EDIT: Quanto sopra non è giusto. La risposta corretta è senza apici inversi.

eval echo '$'$var_name

printenv non è un ksh builtin e non possono essere sempre presente. Per le versioni più vecchie ksh, prima di ksh93 , il metodo eval 'espressione' funziona meglio.

Un metodo efficace in ksh93 è quello di utilizzare le variabili indirezione con 'nameref' o 'typeset -n'.

Definire e verificare un nameref variabile che si riferisce a $PATH:

$ nameref indirect=PATH
$ print $indirect
/usr/bin:/usr/sbin

vedere come il nameref variabile cambia quando cambiamo PATH:

$ PATH=/usr/bin:/usr/sbin:/usr/local/bin
$ print $indirect
/usr/bin:/usr/sbin:/usr/local/bin

Mostra versione ksh e l'alias per nameref:

$ type nameref
nameref is an alias for 'typeset -n'
$ echo ${.sh.version}
Version JM 93t+ 2010-02-02

Per un gradino sopra la vostra risposta (ho speso un sacco di tempo cercando di trovare entrambe queste risposte). Il sotto vi permetterà di esportare una variabile dinamica e poi richiamarla in modo dinamico:

echo -n "Please provide short name for path:"
read PATH_SHORTCUT
echo -n "Please provide path:"
read PATH
eval export \${PATH_SHORTCUT}_PATH="${PATH}"
eval echo Path shortcut: ${PATH_SHORTCUT} set to \$"${PATH_SHORTCUT}_PATH".
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top