以下面的脚本为例:
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 :(得分: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
变量中的变量。
答案 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