区切り文書内の特定の変数のみを拡張する

区切り文書内の特定の変数のみを拡張する

私が質問した内容の延長線です。 コマンドラインからシェルスクリプトにディレクトリを渡す

区切り文字を使用して別のスクリプトを作成するスクリプトがあります。区切り文書に拡張されていない変数を作成できる必要があるため、単一引用符('EOF')を使用してください。ただし、変数を拡張する必要があります。以下のスクリプトが与えられたら、$sourcedirheredocに値をどのように書きますか?

#!/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

私は以下を使ってこのスクリプトを実行しています。

bash script.sh /home/dir/data

/home/dir/data を $1 として sourcedir に渡すことはできますが、qsub を使用してクラスターに送信された配列スクリプトの BASEDIR にも渡す必要があります。

ベストアンサー1

ユースケースに応じて、最も直接的にこれを行うことができます。 heredocを2つの部分に分けます。

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

これは、最初の部分の終わりに使用したい変数を1行追加し、>>文書の残りの部分を同じ方法で最後にリンクしてファイルの最初の部分を構築します。

数行を追加すると、同じ一貫したファイルが完成します。渡す変数が複数ある場合は、一度にすべて入れることもできます。

おすすめ記事