我有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/file1
和path2/file2
。
这里有几个改进,但它所做的唯一关键的事情是在循环之前初始化数组。不这样做意味着只存储最后一个被迭代的项,因为每次迭代都会用一个新的(单个)项覆盖数组。
如果您看到以前返回零项而不是一项的行为,那么您很可能在问题中没有给出的代码部分中创建了一个子shell。有关此常见问题的讨论,请参阅BashFAQ#24。