Ich versuche, alle Variablen mit einem bestimmten Präfix aufzulisten, aber dieses Präfix wird dynamisch bestimmt. Zum Beispiel:
prefix=apple_
apple_one=a1
apple_two=a2
Wenn ich es einfach mache:
echo ${!apple_@}
Ich kann die Variablennamen erhalten, die mit apple_ beginnen. Ich möchte dies jedoch tun, indem ich irgendwie das Variablenpräfix verwende. Alles, was ich versucht habe, führt zu einer schlechten Substitution. Zum Beispiel kann ich nicht:
echo ${!${prefix}@}
Antworten:
Bash analysiert keine verschachtelten Variablenerweiterungen. Sie können tun, was Sie wollen
eval
: Erstellen Sie das Shell-Snippet${!apple_@}
und verwenden Sie es dann in einem Befehl, mit dem Sie es ausführeneval
.Stellen Sie sicher, dass
prefix
nur gültige Bezeichner enthalten sind, da sonst das Snippet zu irgendetwas führen kann.eval
ist normalerweise erforderlich, um mit Variablen zu arbeiten, deren Name dynamisch berechnet wird. In diesem speziellen Fall gibt es jedoch eine völlig andere Möglichkeit, dasselbe zu tun: Verwenden Sie das Vervollständigungssystem. Das Vervollständigungssystem von Bash funktioniert sogar über ein Skript. Das integriertecompgen
Programm listet eine Vervollständigung pro Zeile auf, was nicht eindeutig ist, wenn Vervollständigungen Zeilenumbrüche enthalten können. Dies ist hier jedoch nicht der Fall. Sie enthalten nicht einmal Platzhalterzeichen, sodass die Ausgabe mit einer einfachen Erweiterung ohne Anführungszeichen aufgeteilt werden kann. Dies gibt sicher nichts aus, wenn das Präfix Zeichen enthält, die in Bezeichnern nicht gültig sind.quelle
Sie könnten verwenden
env | grep '^prefix'
.Zum Beispiel:
Wenn Sie nur die Werte und nicht die Variablennamen möchten, verwenden Sie awk:
(oder drucken Sie $ 1 nur für die Variablennamen)
Update 2019-05-17
Ich wurde durch eine Gegenstimme auf diese Antwort zurückgeführt und stellte fest, dass es eine offensichtliche Verbesserung gibt:
typeset -p
funktioniert besser alsenv
, es gibt alle Variablen aus, ob sie exportiert werden oder nicht. Zum Beispiel:So verwenden Sie eine Variable anstelle einer festen Zeichenfolge:
oder exportieren Sie einfach das Präfix $, damit es im ENVIRON-Array von awk verfügbar ist:
Hinweis: Mit ein wenig Arbeit kann dies für andere Shells wie ksh oder zsh verwendet werden. Es ist jedoch wichtig zu beachten, dass das Ausgabeformat für
typeset -p
in anderen Shells unterschiedlich ist, sodass das awk-Skript entsprechend angepasst werden muss Sie.quelle
set
kann auch verwendet werden, wenn es Ihnen nichts ausmacht, Shell-Funktionen mit Ihren Variablen zu mischen.set -o posix; set
${!prefix}
ist jedoch in erster Linie bash-spezifisch (es ist nicht einmal eine ksh-Funktion).typeset -p
funktioniert besser alsenv
, gibt alle Variablen aus, unabhängig davon, ob sie exportiert wurden oder nicht. zBtypeset -p | awk '$3 ~ /^BASH/ {print $3}'
und vermeidet die potenziell gefährliche Verwendung voneval
. Ich hätte mich an den Satz erinnern sollen, als ich diese Antwort zum ersten Mal gepostet habe. zu einer Variablen anstelle einer festen Zeichenfolge:prefix="BASH"; typeset -p | awk '$3 ~ "^"prefix { print $3}' prefix="$prefix"
quelle