구분된 문서에서 특정 변수만 확장

구분된 문서에서 특정 변수만 확장

제가 질문한 내용의 연장선입니다. 명령줄에서 쉘 스크립트로 디렉토리 전달

구분 기호를 사용하여 다른 스크립트를 작성하는 스크립트가 있습니다. 구분된 문서에 확장되지 않은 변수를 작성할 수 있어야 하므로 작은따옴표( '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를 두 부분으로 나누면 됩니다.

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%%$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

관련 정보