bash中的多个列表和多个文件类型

问题描述 投票:0回答:1

问题

存在数据处理问题,其中对不同文件采取一系列操作。但是,在处理过程中,不同类别的文件需要专门化。处理步骤很长且很繁琐,目标是创建并维护一个循环。我的尝试是试图组成一个子列表的主列表,该列表以列表中元素的特定操作为键。

示意图示例

此问题的最小版本。文件类可以用后缀标记。

代表性输入数据

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

bash list nested-loops nested-lists
1个回答
1
投票

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
  1. 这将arr声明为nameref。当您操作arr时,实际上是在操作arr的值指定的变量。]​​>
    您可以使用let j=0let 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
    1. 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
  2. 这将评估字符串arr=( \${foo[@]} ),该字符串将创建一个包含arr元素的数组foo

    间接:

    1. 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
  3. "${!arr}"引用数组foobar,但是我们无法对其进行索引或获取其长度(或者我错过了什么?)。因此,我们不能在此处使用for (( j = 0; ... ))
    Bash reference Manual中搜索nameref,eval和间接寻址的相关文档。
© www.soinside.com 2019 - 2024. All rights reserved.