2017-02-24 28 views
1

我在bash一個函數,得到PARAM一個字符串,例如:創建動態的變量名bash和獲得價值

MYSQL_DATABASE那麼我想在我的文件中創建一個名爲VAR_MYSQL_DATABASE變種,但我不能老是讓值。

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

所以我從用戶'MYSQL_DATABASE_NAME'要求,並在bash腳本設置一個變量名字。這個想法是我必須要求15個變量,並且因爲這個原因我使這個功能變得乾燥。如果我使用這行'read -p'輸入MYSQL_USER_NAME:「MYSQL_DATABASE_NAME」全部有效。 –

回答

2

使用declare內置的bash

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

有了上面的邏輯,你可以修改你name變量如何被控制,無論是局部存在。如果作爲參數從函數/命令行通過做

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

也許你想實現這樣的事情,

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 
} 

所以,在這裏我們正在創建使用動態變量內置的declare和動態部分VAR_$1不能直接作爲正常變量引用,因此使用間接擴展{!variable}來查看創建的變量是否可用。

+1

好的答案++,你可以補充說只有在Unix變量名中允許的字符應該在'$ 1'中傳遞。 – anubhava

+0

對不起,我想我對第一段代碼感到困惑,我編輯了這個問題。 –

+0

您無法同時傳遞變量並從用戶讀取。請清楚說明您的要求 – Inian

2

嘗試以下操作:

#!/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將確保變量存在的功能範圍之外,並且"VAR_$1"用於動態創建變量名。

輸出:

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

裏面唯一的'echo':$ VAR_MYSQL_DATABASE_NAME「'不是動態的。 'MYSQL_DATABASE_NAME'是一個參數。所以不知何故我應該在裏面使用'echo':$ VAR_ $ 1「' –

+0

是的,我知道。這僅僅是爲了例子。它實際上是動態的。我將編輯我的示例。 – Aserre

+0

@IonVasile使用間接方式添加了示例以從動態變量中獲取值。 – Aserre

1

您可以使用printf功能與-v選擇「打印」到一個變量名。

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 
} 

(我曾與一個循環改寫你的功能,避免似乎是在遞歸的一種嘗試。)