我正在嘗試迭代并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
uj5u.com熱心網友回復:
如果使用 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
uj5u.com熱心網友回復:
#! /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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/362997.html
標籤:猛击
下一篇:使用Sed僅替換包含字串的整行
