2014-03-19 159 views
0

因此,采取下面的脚本为例:在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 _...”作为系统所需的我在。

这甚至可能吗?如果没有,那么如果你明白我想要完成的事情,你可以提出一个替代方案吗?

+0

所以,你要,例如,通过更换产生的变量'$ VAR_profileName_serverName'什么'$ PROFILE1'和'$ SERVER1'包含? – fedorqui

+0

@fedorqui正确的,并能够以后引用它 –

回答

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 
+0

我喜欢这种方式比我试图做的更好。虽然fedorqui提到的另一种方法也适用。谢谢! –

+0

我也在我的场景中尝试过这种方法,并且效果很好! –

0

你说这个?

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

输出将是:

ahoj$UNSETVAR 
ahojnow_it_is_set 
3

您可以使用 eval declare这个(thanks 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变量中的变量。

+0

好了,所以引用VAR以后将有可能叫“回声$ VAR_ $ PROFILE1_ $ SERVER1”?主要原因是我不必复制粘贴“serverName”到所有地方,并将其保存在一个位置。 –

+0

@BrandonStout查看我更新的答案,了解如何获取变量。 – fedorqui

+1

我会使用'declare'而不是'eval' –

相关问题