如何将两个列表中的特定字符串匹配在一起?

如何将两个列表中的特定字符串匹配在一起?

我正在尝试将特定的单个字符串匹配在一起。例如,我希望将以下内容配对:

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那么索引来自0N-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较长,则不会检索多余的元素。

相关内容