私が質問した内容の延長線です。 コマンドラインからシェルスクリプトにディレクトリを渡す
区切り文字を使用して別のスクリプトを作成するスクリプトがあります。区切り文書に拡張されていない変数を作成できる必要があるため、単一引用符('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
私は以下を使ってこのスクリプトを実行しています。
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%%
$sourcedir
s
明確にするためにプレースホルダを別の形式に変更しましたが、そのままにして$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