在for循环bash中传播变量



我有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循环子shell之外使用它。

非常感谢,Guy

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

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

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

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

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

最新更新