0

我有 15 个路径存储在一个数组变量中,文件名也存储为另一个数组变量,我想将每个路径绑定到其对应的文件。我正在寻找将每个路径元素与其相应文件绑定的东西,如下所示:

ar1=([1]="path1" [2]="path2")
ar2=([1]="file1" [2]="file2")

我需要:

ar3=([1]="path1/file1" [2]="path2/file2")

我成功地管理了一个简单的for循环:

for i in {1..2}; do
  ar3=("${ar1[$i]}""/""${ar1[$i]}"".txt")
done

但我需要该变量ar3用于脚本的其他部分,并且我不能在 for-loop 子 shell 之外使用它。

非常感谢,盖伊

4

1 回答 1

1

您可以测试它是否有效,并将结果传播到循环之外,如下所示:

dirnames=( path1 path2 )
basenames=( file1 file2 )
paths=( )
for idx in "${!dirnames[@]}"; do
  [[ ${basenames[$idx]} ]] || continue
  paths[$idx]=${dirnames[$idx]}/${basenames[$idx]}.txt
done
printf '%q\n' "${paths[@]}"

您会看到这确实可以正确打印path1/file1path2/file2.

这里有几处改进——但它所做的唯一关键事情是在循环之前初始化数组。不这样做意味着只有最后一个被迭代的项目会被存储,因为你会在每次迭代时用一个新的(单个)项目覆盖数组。

如果您看到返回零项而不是一项的先前行为,您很可能在您的问题中未给出的部分代码中创建了一个子shell。有关此常见问题的讨论,请参阅BashFAQ #24

于 2014-10-30T00:07:13.380 回答