为什么我的 bash 循环生成 $i-$j_filename 不适用于内部循环,所以我只能得到四个文件(1-4_filename、2-4_filename、...) ?

Why is my bash loop to generate $i-$j_filename not working for the inner loop so that I only get four files (1-4_filename, 2-4_filename, ...)?

我有一个参考文件,"filename."我在其中添加了 "FIRST" 和 "SECOND" 两个词。我现在想生成一些文件,其中 FIRST 和 SECOND 被数字替换,文件也相应地命名。例如:

1-1_filename.txt, 1-2_filename.txt, 1-3_filename.txt, 1-4_filename.txt, 2-1_filename.txt, 2-2_filename.txt, 2-3_filename.txt, 2-4_filename.txt, ...等等。

我的代码(如下)正在执行替换和生成文件,但我没有获取所有文件。我只得到 1-4、2-4、3-4 和 4-4。我现在已经试验了几个小时,只是无法弄清楚我做错了什么。我将不胜感激任何指示。谢谢。

    cp filename.txt filename_bak.txt

    for i in 1 2 3 4; do
        for j in 1 2 3 4; do
            sed s~"FIRST"~"$i"~g $i_filename.txt | sed s~"SECOND"~"$j"~g > $i-$j_filename.txt
        done
    done

这似乎是一个拼写错误:$i_filename.txt

您的主要问题在这里:$i-$j_filename.txt。变量中允许有下划线,所以被引用的变量是$j_filename。为了避免,加大括号分开。此外,将整个 sed 命令放在引号内会更具可读性。这是您的脚本的修订版:

cp filename.txt filename_bak.txt
for i in 1 2 3 4; do
    for j in 1 2 3 4; do
        sed "s~FIRST~$i~g" filename.txt | sed "s~SECOND~$j~g" > $i-${j}_filename.txt
    done
done

顺便看看shellcheck.net。那会为您找到主要问题。我有一个本地可执行版本给了我这个错误:

script.sh|5 col 72 warning| j_filename is referenced but not assigned. [SC2154]