每次通过 bash for 循环创建一个新文件



我正在尝试从具有变量名的文件创建多个 shell 脚本。我有一个 bash for 循环来创建必要的行,但我每次通过循环都想要一个新文件。我目前拥有的脚本将所有内容放入一个文件中。输入文件 ( test.txt ) 将每个变量放在单独的行上:

a
b
c

这是我目前拥有的代码:

#!/bin/bash
num=0
echo $num
for x in $(<test.txt)
do
    echo #!/bin/bash
    echo #SBATCH -N 1
    echo #SBATCH -t 6:00:00
    echo #SBATCH --job-name=${x}
    echo . ~/.profile
    echo time java -jar trimmomatic.jar PE -threads 20 ${x}_R1.fastq ${x}_R2.fastq
    num=$((num+1))
done  > trim_${num}.sh
echo $num
exit

这将写入三个带有a,b,c变量的循环来trim_0.sh。我希望a循环在trim_0.shb循环在trim_1.shc循环在trim_2.sh

您可以将循环的主体包装在一个块中,如下所示:

while read -r x
do
    {
        echo '#!/bin/bash'
        echo '#SBATCH -N 1'
        echo '#SBATCH -t 6:00:00'
        echo "#SBATCH --job-name=$x"
        echo '. ~/.profile'
        echo "time java -jar /lustre/software/bioinfo/trimmomatic/0.32/trimmomatic.jar PE -threads 20 ${x}_R1.fastq ${x}_R2.fastq"
    } > "trim_$((num++)).sh"
done < test.txt

我在每echo周围都使用了引号(不涉及任何 shell 变量的单引号,有的双引号)并删除了反斜杠转义,我认为这不是必需的。

我还使用了while read循环,而不是for循环来读取文件。这在您的简单情况下没有区别,但正如评论中指出的那样,是正确的方法。

或者,这也可能是使用 heredoc 的好机会:

while read -r x
do
    cat <<EOF >"trim_$((num++)).sh"
#!/bin/bash
#SBATCH -N 1
#SBATCH -t 6:00:00
#SBATCH --job-name=${x}
. ~/.profile
time java -jar /lustre/software/bioinfo/trimmomatic/0.32/trimmomatic.jar PE -threads 20 ${x}_R1.fastq ${x}_R2.fastq
EOF
done < test.txt