【问题标题】:bash variables values from variablesbash 变量中的变量值
【发布时间】:2018-06-15 13:59:56
【问题描述】:

我在一个文件中有这些变量

PRODUCT="ABC"

ABC_SERVER_1="server-a.com"
ABC_PORT_1="4045"
ABC_SERVER_2="server-b.com"
ABC_PORT_2="2021"
ABC_SERVER="$ABC_SERVER_1"
ABC_PORT="$ABC_PORT_1"

XYZ_SERVER_1="server-c.com"
XYZ_PORT_1="4046"
XYZ_SERVER_2="server-d.com"
XYZ_PORT_2="2022"
XYZ_SERVER="$XYZ_SERVER_2"
XYZ_PORT="$XYZ_PORT_2"

我需要 bash 命令行来给我 PRODUCT_SERVER 和 PRODUCT_PORT

例如,如果 PRODUCT="ABC" $PRODUCT_SERVER 给了我 server-a.com,如果 PRODUCT="XYZ" $PRODUCT_SERVER 给了我 server-d.com 和端口......

【问题讨论】:

    标签: bash variables


    【解决方案1】:

    您最好重新设计使用变量的方式。此外,大写字母通常用于环境变量,而不是脚本中的变量。

    话虽如此,这是一个丑陋的黑客:

    name=${PRODUCT}_SERVER
    set | sed  -n "s/^$name=//p"
    

    【讨论】:

      【解决方案2】:

      解决了

        eval 'PRODUCT_SERVER=${PRODUCT}_SERVER'
        eval 'PRODUCT_PORT=${PRODUCT}_PORT'
        eval 'PRODUCT_SERVER_1=${PRODUCT}_SERVER_1'
        eval 'PRODUCT_PORT_1=${PRODUCT}_PORT_1'
        eval 'PRODUCT_SERVER_2=${PRODUCT}_SERVER_2'
        eval 'PRODUCT_PORT_2=${PRODUCT}_PORT_2'
      
        echo ${!PRODUCT_SERVER}
        echo ${!PRODUCT_PORT}
      

      【讨论】:

        【解决方案3】:

        使用 bash,您可以使用 indirect variable

        server_var="${PRODUCT}_SERVER"
        port_var="${PRODUCT}_PORT"
        echo "${!server_var}:${!port_var}"
        
        server-a.com:4045
        

        或者使用最新版本,name reference

        declare -n server="${PRODUCT}_SERVER" port="${PRODUCT}_PORT"
        echo "$server:$port"
        
        server-a.com:4045
        

        但是,最好使用关联数组:

        declare -A server_1=(
            [ABC]="server-a.com"
            [XYZ]="server-c.com"
        )
        declare -A port_1=(
            [ABC]="4045"
            [XYZ]="4046"
        )
        declare -A server_2=(
            [ABC]="server-b.com"
            [XYZ]="server-d.com"
        )
        declare -A port_2=(
            [ABC]="2021"
            [XYZ]="2022"
        )
        declare -A server=(
            [ABC]="${server_1[ABC]}"
            [XYZ]="${server_2[XYZ]}"
        )
        declare -A port=(
            [ABC]="${port_1[ABC]}"
            [XYZ]="${port_2[XYZ]}"
        )
        
        product="ABC"
        echo "${server[$product]}:${port[$product]}"
        

        【讨论】:

          【解决方案4】:

          您可以使用单个关联数组(老实说,在@glennjackman 发布他的之前,我正在研究这个!):

          declare -A table
          
          table[ABC_SERVER_1]="server-a.com"
          table[ABC_PORT_1]="4045"
          table[ABC_SERVER_2]="server-b.com"
          table[ABC_PORT_2]="2021"
          table[ABC_SERVER]=${table[ABC_SERVER_1]}
          table[ABC_PORT]="${table[ABC_PORT_1]}"
          
          table[XYZ_SERVER_1]="server-c.com"
          table[XYZ_PORT_1]="4046"
          table[XYZ_SERVER_2]="server-d.com"
          table[XYZ_PORT_2]="2022"
          table[XYZ_SERVER]="${table[XYZ_SERVER_2]}"
          table[XYZ_PORT]="${table[XYZ_PORT_2]}"
          
          product="ABC"
          echo "${table[${product}_SERVER]}"
          
          product="XYZ"
          echo "${table[${product}_SERVER]}"
          

          给予:

          server-a.com
          server-d.com
          

          请注意,键可以是您喜欢的任何大小写,而不必担心与 shell 变量名称冲突。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-01
            • 1970-01-01
            相关资源
            最近更新 更多