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

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

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

区切り文字を使用して別のスクリプトを作成するスクリプトがあります。区切り文書に拡張されていない変数を作成できる必要があるため、単一引用符('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行追加し、>>文書の残りの部分を同じ方法で最後にリンクしてファイルの最初の部分を構築します。

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

答え2

引用とは異なり、この資料では拡張機能を停止して再起動できないため、少し難しいです。ただし、次のコマンドを使用してこの文書を後処理できますsed

#!/bin/bash
sourcedir=/some/path
sed -e "s,%%sourcedir%%,$sourcedir,g" << 'EOF'
some commands here with $variables not expanded 
except for the special %%sourcedir%%, which is
EOF

実行すると、次のような出力が生成されます。

some commands here with $variables not expanded 
except for the special /some/path, which is

このコマンドは、その値に関係なく、sedそのコマンドのすべてのインスタンスを変更します(コンマが含まれていない場合は、コマンドの区切り文字を別のものに変更する必要があります)。%%sourcedir%%$sourcedirs

明確にするためにプレースホルダを別の形式に変更しましたが、そのままにして$sourcedirくださいsed -e "s,\$sourcedir,$sourcedir,"$sourcedirectory${sourcedir}

または以下を使用してください。牛に似た一種の栄養envsubst文書がある場合(文書の一部gettext):

#!/bin/bash
export sourcedir=/some/path
envsubst '$sourcedir' << 'EOF'
some commands here with $variables not expanded 
except for the special $sourcedir, which is
EOF

関連情報