【问题标题】:Use iterator inside array name在数组名称中使用迭代器
【发布时间】:2021-12-30 14:20:54
【问题描述】:

我正在尝试迭代并在另一个变量中使用变量 i

我有三个数组,在迭代时我想指定我正在引用的数组的正确变量名。如何在 bash 中执行此操作?

CONTAINER_1_FILES=()
CONTAINER_2_FILES=()
CONTAINER_3_FILES=()

  for ((i=1; i <= 3; i++))
  do
    CURRENT_CONTAINER=("${CONTAINER_$i_FILES[@]}") # I am trying to use $i here
    echo ${CURRENT_CONTAINER[@]}
  done

【问题讨论】:

标签: bash


【解决方案1】:
#! /bin/bash

declare -a CONTAINER_1_FILES=(a b c)
declare -a CONTAINER_2_FILES=(d e f)
declare -a CONTAINER_3_FILES=(g h i)
declare -a CURRENT_CONTAINER=()

for ((i=1; i <= 3; i++)); do
    declare -n CURRENT_CONTAINER_REF="CONTAINER_${i}_FILES"
    CURRENT_CONTAINER=(${CURRENT_CONTAINER_REF[@]})
    echo "DECLARATION:${CURRENT_CONTAINER[@]@A}"
    echo "VALUES ... :${CURRENT_CONTAINER[@]}"
done

【讨论】:

    【解决方案2】:

    如果使用 Bash >=4.2,nameref 变量将满足您的需要:

    #!/usr/bin/env bash
    
    container_1_files=(foo1 bar1 baz1)
    container_2_files=(foo2 bar2 baz2 quux)
    container_3_files=(foo3 bar3)
    
    containers=(container_1 container_2 container_3)
    
    for container in "${containers[@]}"; do
      declare -n container_files="${container}_files"
      printf 'Files from %s:\n' "$container"
      printf '%s\n' "${container_files[@]}"
    done
    

    输出:

    Files from container_1:
    foo1
    bar1
    baz1
    Files from container_2:
    foo2
    bar2
    baz2
    quux
    Files from container_3:
    foo3
    bar3
    

    现在,如果您要为容器引用文件,请将这些文件放置或链接到实际的文件系统目录中,而不是尝试将文件夹/文件层次结构复制到 Bash 数组和动态变量名称中。

    作为奖励,它甚至可以使用 POSIX shell 语法:

    #!/usr/bin/env sh
    
    mkdir -p -- container_1 container_2 container_3
    cd container_1 && { touch foo1 bar1 baz1;} && cd .. || exit
    cd container_2 && { touch foo2 bar2 baz2 quux;} && cd .. || exit
    cd container_3 && { touch foo3 bar3;} && cd .. || exit
    
    for container in ./container_*; do
      printf 'Files from %s:\n' "$container"
      for file in "$container/"*; do
        printf '%s\n' "${file##*/}"
      done
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2017-11-27
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      相关资源
      最近更新 更多