嵌套 bash 循环只执行一次

Nested bash loop to execute only once

我需要创建多个包含如下内容的文件,并从其他 3 个不同的文件中替换它的值。

 name: 
 url:  
 description: 

我尝试使用 while 循环向上述内容添加值,但它以 3^3 组合执行,实际上我需要的是创建一个文件,其中替换了 3 个文件的第一行,第二个文件替换为第二行替换的 3 个文件中的一个,依此类推。

这是我使用的代码。

while read line1;
 do 
 while read line2;
 do 
 while read line3;
 do 
 echo "
 name: $line1
 url:  $line2
 description: $line3

" > $line1.txt ;

done < url.txt
done < description.txt
done < name.txt

在嵌套循环中,每个循环都会一次处理整个文件,导致输出不同步。

相反,您需要在单个 while 循环中读取 3 个文件,使用额外的文件描述符来处理其他文件:

while read name && read description <&3 && read url <&4; do
  echo "
  name: $name
  url:  $url
  description: $description

  " > $name.txt
done < name.txt 3< description.txt 4< url.txt

假设文件 name.txturl.txtdescription.txt 具有相同的行数,则可以使用 pastesed 完成此任务公用事业:

paste -d '\n' name.txt url.txt description.txt |
sed 'N;N;s/\(.*\n\)\(.*\n\)/name: url: description: /'

或者,如果文件不是太大,另一种 bash 解决方案可能是:

#!/bin/bash

mapfile names < name.txt
mapfile urls < url.txt
mapfile descs < description.txt

for ((i = 0; i < ${#names[@]}; ++i)); do
    printf 'name: %surl: %sdescription: %s' \
           "${names[i]}" "${urls[i]}" "${descs[i]}"
done