5

我需要在一堆文件上运行一个脚本,这些文件的路径被分配给train1, train2, ... , 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$iechoestrain1的名称,而不是它的值。

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

4

2 回答 2

9

使用数组。

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
于 2013-06-26T18:37:58.850 回答
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

或评估,但它很糟糕:

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
于 2013-06-26T11:46:20.800 回答