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 提交到集群的数组脚本中。
您可以最直接地根据您的使用情况来执行此操作,只需将您的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)
这只是构建文件的第一部分,使用 附加您想要在第一部分末尾可用的变量的单行>>,然后以相同的方式将文档的其余部分连接到末尾。
最后你会得到相同的连贯文件,并且只需要额外编写几行。如果您有多个变量要传递,您也可以将它们一次性全部放入。