仅扩展定界文档中的某些变量

Ron*_*Ron 8 command-line shell bash shell-script cluster

这是我提出的问题的延伸。 将目录从命令行传递到 shell 脚本

我有一个脚本,它使用定界符编写另一个脚本。我需要能够在定界文档中写入未展开的变量,因此我使用单引号 ( 'EOF')。但是,我需要扩展一个变量。$sourcedir给定下面的脚本,我如何在heredoc中写入 的值?

#!/bin/bash 

sourcedir="$1"
cd $sourcedir

find "$PWD" -maxdepth 2 -name \*_R1*.fastq.gz > list1

fastq_list=$sourcedir/list1 echo `cat $fastq_list` num_files=$(wc -l < 
 $sourcedir/list1) echo $num_files



cat > run_array_job.sh<<'EOF'

#!/bin/bash -l
#$ -j y
#$ -cwd -S /bin/sh
#$ -l h_vmem=10G
#$ -pe smp 12

if [ -z "${SGE_TASK_ID}" ]; then   echo "Need to set SGE_TASK_ID"   exit 1 fi


 BASEDIR=$sourcedir

 echo "BASEDIR" echo $BASEDIR

 BASEFILES=$( ls *_R1.fastq.gz)
 BASEFILES_ARRAY=(${BASEFILES})
 BASEFILE=${BASEFILES_ARRAY[(${SGE_TASK_ID} - 1)]}
 echo $BASEFILE


 ...................
 ...................

 EOF

 qsub -t 1-${num_files}  run_array_job.sh
Run Code Online (Sandbox Code Playgroud)

我正在使用运行这个脚本

bash script.sh /home/dir/data
Run Code Online (Sandbox Code Playgroud)

我可以将 /home/dir/data 作为 $1 传递到 sourcedir,但它还需要传递到 BASEDIR ,在使用 qsub 提交到集群的数组脚本中。

Mic*_*mer 4

您可以最直接地根据您的使用情况来执行此操作,只需将您的heredoc分成两部分:

cat > run_array_job.sh<<'EOF'

#!/bin/bash -l
...
EOF

printf 'BASEDIR="%s"\n" "$sourcedir" >> run_array_job.sh

cat >> run_array_job.sh<<'EOF'
echo "BASEDIR" echo $BASEDIR
...
EOF

qsub -t 1-${num_files}  run_array_job.sh
Run Code Online (Sandbox Code Playgroud)

这只是构建文件的第一部分,使用 附加您想要在第一部分末尾可用的变量的单行>>,然后以相同的方式将文档的其余部分连接到末尾。

最后你会得到相同的连贯文件,并且只需要额外编写几行。如果您有多个变量要传递,您也可以将它们一次性全部放入。