组合变量和字符串,并获得在单行中形成的变量的值

时间:2019-04-05 14:03:08

标签: bash shell

我在写剧本时遇到了情况。

Audio_Repo = "/src/audio_123";
Audio_ImgTag = "aud021882";
Audio_Enable = 1;
.....
Video_Repo = "/src/vid_823";
Video_ImgTag = "video9282";
Video_Enable = 0;
....


#Say proj_var ="Audio"
#it could be either Audio or Video  based on some conditional check
....
proj_var = "Audio"
....
PROJECT_REPO= ${!{$proj_var"_Repo"}}
#PROJECT_REPO should hold the value "src/audio_123" 

但是上面的表示引发了错误的替换错误 我知道我可以如下使用临时变量

temp= $proj_var"_Repo";
PROJECT_REPO = ${!temp};

但是我有很多属性,并且我不想为每个属性使用临时变量。相反,我想要单行替换。

2 个答案:

答案 0 :(得分:0)

一种方法是使用eval

#! /bin/bash -p

Audio_Repo="/src/audio_123"
Audio_ImgTag=aud021882
Audio_Enable=1
# ...
Video_Repo=/src/vid_823
Video_ImgTag=video9282
Video_Enable=0
# ....


# Say proj_var="Audio"
# it could be either Audio or Video  based on some conditional check
# ....
proj_var="Audio"
# ....

eval "Project_Repo=\${${proj_var}_Repo}"

# Project_Repo should hold the value "src/audio_123" 
printf '%s\n' "$Project_Repo"

另一种选择是使用助手功能:

# ...

# Set the value of the variable whose name is in the first parameter ($1)
# to the value of the variable whose name is in the second parameter ($2).
function setn { printf -v "$1" '%s' "${!2}" ; }

# ...

setn Project_Repo "${proj_var}_Repo"

使用setn(一个较差的名称,选择一个更好的名称)功能可以避免使用临时变量和eval

答案 1 :(得分:0)

使用数组,而不是您需要操纵的变量名。

Repo=0
ImgTag=1
Enable=2

Audio=(/src/audio_123 aud021882 1)
Video=(/src/vid_823 video9282 0)

proj_repo=Audio[$Repo]
project_var=${!proj_repo}