2017-02-24 3 views
1

ich eine Funktion in der Bash, die param einen String zu erhalten, zum Beispiel:dynamische Variablennamen bash und bekommen Wert

MYSQL_DATABASE dann möchte ich in meiner Datei eine var erstellen namens VAR_MYSQL_DATABASE aber ich kann leider nicht das bekommen Wert.

create_var() 
{ 

    read -p "Enter $1 : " VAR_$1 
    printf VAR_$1 // print VAR_MYSQL_DATABASE_NAME instead what I typed, so how do I get the value? 
    if [[ -z VAR_$1 ]]; then 
     printf '%s\n' "No input entered. Enter $1" 
     create_entry $1 
    fi 
} 

create_var "MYSQL_DATABASE_NAME" 
+0

Benutzer 'MYSQL_DATABASE_NAME' Also von frage ich und eine Variable in dem Bash-Skript-Set mit der Name. Die Idee ist, dass ich 15 Variablen fragen muss und deswegen habe ich diese Funktion gemacht, um trocken zu sein. Wenn ich diese Zeile 'read -p 'benutze, geben Sie MYSQL_USER_NAME ein:" MYSQL_DATABASE_NAME "funktioniert alles. –

Antwort

2

Verwenden Sie die declare eingebaut in bash,

name="MYSQL_DATABASE" 
declare VAR_${name}="Some junk string" 
printf "%s\n" "${VAR_MYSQL_DATABASE}" 
Some junk string 

Mit der obigen Logik, können Sie ändern, wie Sie Ihre name variabel gesteuert wird, entweder vor Ort präsent. Wenn es als Argument einer Funktion/Befehlszeile tun

declare VAR_${1}="Your string value here" 

Vielleicht wollen Sie so etwas wie dies zu erreichen, übergeben wird,

create_var() 
{ 
    read -p "Enter value: " value 
    declare -g VAR_$1="$value" 

    dynamVar="VAR_$1" 

    if [[ -z "${!dynamVar}" ]]; then 
     printf '%s\n' "No input entered. Enter $1" 
     create_entry $1 
    fi 
} 

So, hier schaffen wir die dynamische Variable Die integrierte declare und mit dem dynamischen Teil VAR_$1 kann nicht direkt als normale Variablen referenziert werden, daher die indirekte Erweiterung {!variable} verwenden, um festzustellen, ob die erstellte Variable verfügbar ist.

+1

Gute Antwort ++, können Sie hinzufügen, dass nur erlaubte Zeichen in einem Unix-Variablennamen in '$ 1' übergeben werden sollte. – anubhava

+0

Sorry, ich glaube, ich war mit dem ersten Stück Code verwirrend, editierte ich die Frage. –

+0

Sie können die Variable nicht übergeben und gleichzeitig vom Benutzer lesen. Bitte geben Sie Ihre Anforderungen eindeutig – Inian

2

Versuchen Sie Folgendes:

#!/bin/bash 

create_var() { 
     declare -g VAR_$1 
     ref=VAR_$1 
     read -p "Enter $1: " "VAR_$1" 

     echo "inside : ${!ref}" 
} 

create_var "MYSQL_DATABASE_NAME" 
echo "output : $VAR_MYSQL_DATABASE_NAME" 

declare -g sicher, wird die Variable außerhalb des Funktionsumfangs vorhanden ist, und "VAR_$1" verwendet wird, um dynamisch die Variablennamen zu erstellen.

Ausgang:

Enter MYSQL_DATABASE_NAME: Apple 
inside : Apple 
output : Apple 
+0

Die einzige Sache ist, dass "echo" innen: $ VAR_MYSQL_DATABASE_NAME "' nicht dynamisch ist. 'MYSQL_DATABASE_NAME' ist ein Parameter. Also sollte ich irgendwie 'echo 'verwenden: $ VAR_ $ 1" ' –

+0

Ja, ich weiß. Dies war nur zum Beispiel willen. Es ist tatsächlich dynamisch. Ich bearbeite mein Beispiel. – Aserre

+0

@IonVasile hat das Beispiel mit Indirection hinzugefügt, um den Wert von der dynamischen Variable zu erhalten. – Aserre

1

können Sie verwenden, um die printf Funktion mit der -v Option "Drucken" zu einem Variablennamen.

create_var() 
{ 
    while : ; do 
     IFS= read -r -p "Enter $1 : " value 
     if [[ -n $value ]]; then 
      printf -v "VAR_$1" '%s' "$value" 
      return 
     fi 
     printf 'No input entered. Enter %s\n' "$1" 
    done 
} 

(Ich habe Ihre Funktion mit einer Schleife neu geschrieben zu vermeiden, was bei Rekursion ein Versuch zu sein schien.)