Bash
僅擴展heredoc中的某些變數
這是我問的問題的延伸。 將目錄從命令行傳遞到 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
這只是建構文件的第一部分,在第一部分的末尾附加您希望變數可用的單行,
>>
然後以相同的方式在末尾加入文件的其餘部分。你最終得到了相同的連貫文件,並且只多寫了幾行。如果您有多個變數要傳遞,您也可以一次將它們全部放入。