Bash

僅擴展heredoc中的某些變數

  • March 12, 2019

這是我問的問題的延伸。 將目錄從命令行傳遞到 shell 腳本

我有一個使用heredoc 編寫另一個腳本的腳本。我需要能夠在 heredoc 中編寫未擴展的變數,所以我使用單引號 ( '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 但它也需要傳遞給 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

這只是建構文件的第一部分,在第一部分的末尾附加您希望變數可用的單行,>>然後以相同的方式在末尾加入文件的其餘部分。

你最終得到了相同的連貫文件,並且只多寫了幾行。如果您有多個變數要傳遞,您也可以一次將它們全部放入。

引用自:https://unix.stackexchange.com/questions/505949