我在写剧本时遇到了情况。
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};
但是我有很多属性,并且我不想为每个属性使用临时变量。相反,我想要单行替换。
答案 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"
eval
是危险的,应尽可能避免。参见Why should eval be avoided in Bash, and what should I use instead?。在这种情况下,尽管详细程度有所提高,但临时变量是一个更好的选择。PROJECT_REPO
替换为Project_Repo
,以避免可能与环境变量发生冲突。参见Correct Bash and shell script variable capitalization。=
周围的空格是错误。行尾不需要分号。另一种选择是使用助手功能:
# ...
# 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}