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