如何在Shell脚本中使用变量作为环境变量名称?

6
我有一个环境配置文件,其中我定义了环境变量。我使用source命令在我的shell脚本(bash)中获取这些变量。
我在我的shell脚本中使用checkout命令来检出从环境变量中定义的位置的文件。现在我需要使用多个位置来检出文件,这可以是不同运行shell脚本的任意数量。
例如,用户在配置文件中提供了两个路径PATH1和PATH2,以及NUM_OF_PATHS为2。
在我的shell脚本中,我想要像下面这样做来使用路径。
i=0
echo ${NUM_OF_PATHS}
while [ $i -lt ${NUM_OF_PATHS} ]
do
    checkout $PATH{$i}
    i=`expr $i + 1`
done

我该如何使用变量i来形成环境变量PATH1或PATH2等?
4个回答

7
i=1
while [ $i -le ${NUM_OF_PATHS} ]
do
  CPATH=$(eval echo \$\{PATH$i\})
  echo "PATH$i: $CPATH"
  let i++ 
done

eval将其参数组合并求值,然后执行组合表达式。在此例中,eval执行:echo ${PATH1}。为了做到这一点,我们首先转义${...},以便在eval之后echo可以接收它们。唯一未转义的特殊字符是$i之前。eval会扩展它并剥离转义字符,然后使用结果执行echo。

因此,CPATH=$(eval echo \$\{PATH$i\})变成了CPATH=$(echo ${PATH1}),而CPATH获得了echo的输出。


0
这里有一个完整的例子,我认为它可以做到你想要的。下面是我的原始消息,因为某种原因被投票否决,但我并不完全理解:
$ cat test.sh
function checkout() {
    echo "Registering $1"
}

PATH1="Path1;/usr/bin"
PATH2="Path2;/bin"
NUM_OF_PATHS=2

i=1
echo $NUM_OF_PATHS
while [ $i -le $NUM_OF_PATHS ]
do
    eval "checkout \$PATH$i"
    i=`expr $i + 1`
done
$ bash test.sh
2
Registering Path1;/usr/bin
Registering Path2;/bin
$

原始信息 你可以使用"eval"命令。这是一个例子(适用于GNU bash版本4.2.37(2)-release):

$ A1="Variable 1"
$ A2="Variable 2"
$ for i in {1..2}; do eval "echo \$A$i"; done
Variable 1
Variable 2
$

字符串将被解析为 "echo $A1" 和 "echo $A2",然后 eval 将执行您想要的操作。

0

为什么不使用数组变量?使用一个数组MYPATH[]来代替多个PATH1和PATH2变量。

MYPATH=(
path0
path1
path2
)
MYPATH[3]=path3

NUM_OF_PATHS="${#MYPATH[@]}"
echo ${NUM_OF_PATHS}

for ((i=0; i < NUM_OF_PATHS; i++))
do
    checkout ${MYPATH[$i]}
done

-2

使用花括号来包含名称:${PATH$i}


1
它不起作用。我尝试了所有带花括号的组合。它会出现错误的替换错误。 - Anuj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接