嵌套 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.txt
、url.txt
和 description.txt
具有相同的行数,则可以使用 paste
和 sed
完成此任务公用事业:
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
我需要创建多个包含如下内容的文件,并从其他 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.txt
、url.txt
和 description.txt
具有相同的行数,则可以使用 paste
和 sed
完成此任务公用事业:
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