创建动态变量名称bash并获取值

时间:2017-02-24 11:04:27

标签: bash

我在bash中有一个函数,它将param作为字符串,例如:

MYSQL_DATABASE然后我想在我的文件中创建一个名为VAR_MYSQL_DATABASE的var,但我无法获得该值。

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"

3 个答案:

答案 0 :(得分:2)

使用bash中内置的declare

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 :(得分: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

答案 2 :(得分: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  
}

(我已经用循环重写了你的函数,以避免看起来像是递归的尝试。)