我正在尝试从具有变量名的文件创建多个 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.sh
,b
循环在trim_1.sh
,c
循环在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