我正在尝试将特定的单个字符串匹配在一起。例如,我希望将以下内容配对:
file1 和 123.jpg file2 和 432.jpg file3 和 345.jpg
目前,我正在使用以下低效的方法来匹配两个列表之间的所有可能性:
declare -a name1=("file1" "file2" "file3")
declare -a name2=("123.jpg" "432.jpg" "345.jpg")
for y in "${name1[@]}"
do
for x in "${name2[@]}"
do
echo $y$x
done
done
该脚本提供以下输出:file1123.jpg file1432.jpg file1345.jpg file2123.jpg file2432.jpg file2345.jpg file3123.jpg file3432.jpg file3345.jpg
我怎样才能只匹配所需的对,以便输出如下所示:file1123.jpg file2432.jpg file3345.jpg
答案1
索引数组是……索引的。:) 每个元素都有一个索引(数字)。您想将 的第 0 个元素name1
与 的第 0 个元素配对,将 的第 1 个元素name2
与 的第 1 个元素配对,等等。
您不需要循环遍历元素,而是需要循环遍历索引。${#name1[@]}
扩展为名为的数组的长度name1
。让我们表示这个长度否。 如果否大于0那么索引来自0到N-1。以下代码片段循环遍历索引name1
:
#!/bin/bash
declare -a name1=("file1" "file2" "file3")
declare -a name2=("123.jpg" "432.jpg" "345.jpg")
for (( i=0; i<"${#name1[@]}"; i++ ))
do
printf '%s\n' "${name1[i]}${name2[i]}"
done
笔记:
printf
优于echo
。- 变量应该用双引号引起来除非你确实知道你不想引用他们。
- 代码循环遍历 的索引
name1
。如果name2
较短,则任何缺失元素都将扩展为空字符串。如果name2
较长,则不会检索多余的元素。