在bash脚本中迭代变量名

时间:2013-06-26 11:44:12

标签: bash

我需要在一堆文件上运行脚本,这些路径分配给train1train2,...,train20,我想'为什么不做用bash脚本自动?'。

所以我做了类似的事情:

train1=path/to/first/file
train2=path/to/second/file
...
train20=path/to/third/file

for i in {1..20}
do
    python something.py train$i
done

由于train$i回显了train1的名称,但没有效果,因此无效。

所以我尝试过$(train$i)${train$i}${!train$i}等不成功的事情。 有谁知道如何捕捉这些变量的正确值?

2 个答案:

答案 0 :(得分:4)

您可以使用数组:

train[1]=path/to/first/file
train[2]=path/to/second/file
...
train[20]=path/to/third/file

for i in {1..20}
do
    python something.py ${train[$i]}
done

或eval,但它很糟糕:

train1=path/to/first/file
train2=path/to/second/file
...
train20=path/to/third/file

for i in {1..20}
do
    eval "python something.py $train$i"
done

答案 1 :(得分:4)

使用数组。

Bash确实有变量间接,所以你可以说

for varname in train{1..20}
do
    python something.py "${!varname}"
done

!引入了间接,因此“获取由varname值命名的变量的值”

但是使用数组。您可以使定义非常易读:

trains=(
    path/to/first/file
    path/to/second/file
    ...
    path/to/third/file
)

请注意,此数组的第一个索引位于零位置,因此:

for ((i=0; i<${#trains[@]}; i++)); do
    echo "train $i is ${trains[$i]}"
done

for idx in "${!trains[@]}"; do
    echo "train $idx is ${trains[$idx]}"
done