在Bash脚本中,如何将变量添加到变量名中?

时间:2014-03-19 15:18:28

标签: linux bash

以下面的脚本为例:

PROFILE1=profileName
SERVER1=serverName
PROFILE2=profile2Name
SERVER2=server2Name

VAR_$PROFILE1_$SERVER1=/home/$PROFILE1/$SERVER1/data
VAR_$PROFILE1_$SERVER2=/home/$PROFILE1/$SERVER2/data
VAR_$PROFILE2_$SERVER1=/home/$PROFILE2/$SERVER1/data

echo "$VAR_$PROFILE1_$SERVER1"

这是我试图完成的基础知识。这可能不是最好的解决方法,但对于那些对bash脚本来说相当新的人来说,这是我第一次想到如何做到这一点。

我需要能够只更改脚本文件中的一个位置,并能够添加新的" VAR _..."根据我所使用的系统的需要。

这甚至可能吗?如果没有,那么如果你理解我想要完成什么,你能建议一个替代方案吗?

3 个答案:

答案 0 :(得分:3)

您可以使用 eval declarethanks Glenn Jackman for pointing in the good direction!):

$ declare VAR_${PROFILE1}_${SERVER1}="hello"
$ echo $VAR_profileName_serverName
hello

在你的情况下:

declare VAR_${PROFILE1}_${SERVER1}=/home/$PROFILE1/$SERVER1/data
declare VAR_${PROFILE1}_${SERVER2}=/home/$PROFILE1/$SERVER2/data
declare VAR_${PROFILE2}_${SERVER1}=/home/$PROFILE2/$SERVER1/data

请注意VAR_${PROFILE1}_${SERVER1}的使用。大括号告诉了变量的确切名称,因为否则VAR_$PROFILE1_$SERVER1会查找名为PROFILE1_的变量等。

echo VAR_${PROFILE1}_${SERVER1}返回VAR_profileName_serverName时,您可以使用以下内容来使用变量:

$ var="VAR_${PROFILE1}_${SERVER1}"
$ echo ${!var}
/home/profileName/serverName/data

请注意,${!var}variable indirection,用于获取名称在$var变量中的变量。

答案 1 :(得分:3)

如果你有bash版本4,请使用关联数组:

declare -A data
data=(
  [$PROFILE1,$SERVER1]=/home/$PROFILE1/$SERVER1/data
  [$PROFILE1,$SERVER2]=/home/$PROFILE1/$SERVER2/data
  [$PROFILE2,$SERVER1]=/home/$PROFILE2/$SERVER1/data
)
for key in "${!data[@]}"; do
    printf "%s\t%s\n" "$key" "${data[$key]}"
done
echo "${data[$PROFILE1,$SERVER2]}"
profileName,server2Name /home/profileName/server2Name/data
profileName,serverName  /home/profileName/serverName/data
profile2Name,serverName /home/profile2Name/serverName/data
/home/profileName/server2Name/data

答案 2 :(得分:0)

你是说这个?

ABC="ahoj\$UNSETVAR"
echo $ABC
UNSETVAR=now_it_is_set
eval "DEV=$ABC"
echo $DEV

输出将是:

ahoj$UNSETVAR
ahojnow_it_is_set