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

时间:2015-04-14 12:57:01

标签: bash shell loops redirect for-loop

我正在尝试从具有变量名称的文件创建多个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

1 个答案:

答案 0 :(得分:1)

你可以将循环体包裹在一个块中,如下所示:

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