5

我有一个环境配置文件,我在其中定义了环境变量。我使用 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

4 回答 4

6
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 可以在 eval 之后接收它们。唯一未转义的特殊字符是$before i。eval 扩展它并去除转义字符并使用结果执行 echo。

因此,CPATH=$(eval echo \$\{PATH$i\})变为CPATH=$(echo ${PATH1})CPATH 得到回显输出。

于 2012-07-27T04:09:42.123 回答
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
于 2012-07-27T07:38:58.440 回答
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 将执行您想要的操作。

于 2012-07-27T04:05:28.193 回答
-2

在名称周围使用花括号:${PATH$i}

于 2012-07-27T04:07:07.523 回答