제가 질문한 내용의 연장선입니다. 명령줄에서 쉘 스크립트로 디렉토리 전달
구분 기호를 사용하여 다른 스크립트를 작성하는 스크립트가 있습니다. 구분된 문서에 확장되지 않은 변수를 작성할 수 있어야 하므로 작은따옴표( '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를 두 부분으로 나누면 됩니다.
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
이는 첫 번째 부분 끝에 사용하려는 변수를 한 줄 추가한 >>
다음 문서의 나머지 부분을 같은 방식으로 끝에 연결하여 파일의 첫 번째 부분을 빌드합니다.
몇 줄만 추가하면 동일한 일관된 파일이 완성됩니다. 전달할 변수가 여러 개인 경우 한 번에 모두 넣을 수도 있습니다.
답변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