我正在编写一个脚本,目的是生成大量其他脚本。我正在使用for循环,它回显了每个脚本所需的代码文本然后>它进入.sh文件。我是这样写的:
#!/bin/bash
for i in {1..30} ; do
echo
"#!/bin/bash
#$ -N DT_STAR_$i
#$ -l mem_free=200G
#$ -pe openmp 4
#$ -q bio,abio,pub8i
module load STAR/2.5.2a
STAR --genomeDir /dfs1/bio/dtatarak/indexes/STAR_Index --readFilesIn
DT_$i.read1.fastq DT_$i.read2.fastq --runThreadN 4 --outFileNamePrefix
/David_data1/DT_$i" > DT_STAR_map_$i.sh
done
基本上我想要它做的是在''中使用所有代码行,并在每次将DT_i更改为DT_1,DT_2,DT_3等时将它们放入新的.sh文件中。终端,它确实生成了所有.sh文件,但没有放入任何内容。它将引号的内容打印到我的屏幕,并显示消息“没有这样的文件或目录”。我不确定我做错了什么。有没有更好的方法来实现我想要做的事情?
谢谢!
答案 0 :(得分:3)
您无法启动字符串以在与echo
命令本身不同的行上进行回显。 echo
行末尾的换行结束该命令,然后将该字符串视为自己执行的命令。但是没有这个名字的命令,所以你得到一个错误。
此外,您不能像现在这样在多行中拆分STAR
命令。
for i in {1..30} ; do
echo "#!/bin/bash
#$ -N DT_STAR_$i
#$ -l mem_free=200G
#$ -pe openmp 4
#$ -q bio,abio,pub8i
module load STAR/2.5.2a
STAR --genomeDir /dfs1/bio/dtatarak/indexes/STAR_Index --readFilesIn DT_$i.read1.fastq DT_$i.read2.fastq --runThreadN 4 --outFileNamePrefix /David_data1/DT_$i" > DT_STAR_map_$i.sh
done
编写多行的更常见方法是使用here-doc。
for i in {1..30} ; do
cat <<EOF > DT_STAR_map_$i.sh
#!/bin/bash
#$ -N DT_STAR_$i
#$ -l mem_free=200G
#$ -pe openmp 4
#$ -q bio,abio,pub8i
module load STAR/2.5.2a
STAR --genomeDir /dfs1/bio/dtatarak/indexes/STAR_Index --readFilesIn DT_$i.read1.fastq DT_$i.read2.fastq --runThreadN 4 --outFileNamePrefix /David_data1/DT_$i
EOF
done