存在数据处理问题,其中对不同文件采取一系列操作。但是,在处理过程中,不同类别的文件需要专门化。处理步骤很长且很繁琐,目标是创建并维护一个循环。我的尝试是试图组成一个子列表的主列表,该列表以列表中元素的特定操作为键。
此问题的最小版本。文件类可以用后缀标记。
export suffix=".png .svg"
export foo="a b c"
export bar="alpha beta chi"
使用伪代码
loop over master list
first sublist foo
create file names: a.png b.png c.png
second sublist bar
create file names: alpha.svg beta.svg chi.svg
嵌套的计数器会很长,因为列表很长。例如。 chi.svg
将是步骤2.3
nameref:
foo=(a b c)
bar=(alpha beta chi)
arrays=(foo bar)
suffix=(.png .svg)
declare -n arr
let i=0
for arr in "${arrays[@]}"; do
for elem in "${arr[@]}"; do
echo "${elem}${suffix[i]}"
done
let i++
done
arr
声明为nameref。当您操作arr
时,实际上是在操作arr
的值指定的变量。]>您可以使用let j=0
和let j++
为内部循环添加计数器,或执行以下操作:
for (( i = 0; i < ${#arrays[@]}; i++ )); do declare -n arr="${arrays[i]}" for (( j = 0; j < ${#arr[@]}; j++ )); do echo "${arr[j]}${suffix[i]}" done done
eval
:
foo=(a b c)
bar=(alpha beta chi)
suffix=(.png .svg)
arrays=(foo bar)
for (( i = 0; i < ${#arrays[@]}; i++ )); do
eval "arr=( \${${arrays[i]}[@]} )"
for (( j = 0; j < ${#arr[@]}; j++ )); do
echo "${arr[j]}${suffix[i]}"
done
done
arr=( \${foo[@]} )
,该字符串将创建一个包含arr
元素的数组foo
。间接:
foo=(a b c)
bar=(alpha beta gama)
arrays=('foo[@]' 'bar[@]')
suffix=(.png .svg)
let i=0
for arr in "${arrays[@]}"; do
for elem in "${!arr}"; do
echo ${elem}${suffix[i]}
done
let i++
done
"${!arr}"
引用数组foo
或bar
,但是我们无法对其进行索引或获取其长度(或者我错过了什么?)。因此,我们不能在此处使用for (( j = 0; ... ))
。在Bash reference Manual中搜索nameref,eval
和间接寻址的相关文档。