我需要在一堆文件上运行脚本,这些路径分配给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$i
回显了train1
的名称,但没有效果,因此无效。
所以我尝试过$(train$i)
或${train$i}
或${!train$i}
等不成功的事情。
有谁知道如何捕捉这些变量的正确值?
答案 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