내 make 파일에 대한 호출을 출력하는 bash 스크립트가 있습니다.
#!/bin/bash
mylist=(
'SAMPLES_OUT=$(call list_samples,AON_9,NT_1,SC_17) GFF=/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me1.gff'
'SAMPLES_OUT=$(call list_samples,AON_10,NT_2,SC_18) GFF=/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me2.gff'
'SAMPLES_OUT=$(call list_samples,AON_11,NT_3,SC_19) GFF=/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me3.gff'
'SAMPLES_OUT=$(call list_samples,AON_12,NT_4,SC_20) GFF=/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me4.gff'
'SAMPLES_OUT=$(call list_samples,AON_13,NT_5,SC_21) GFF=/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me5.gff'
)
for SAMPLES_out in "${mylist[@]}";
do
make -f make_gene_read_count.mk -n SAMPLES_OUT=\'${SAMPLES_out}\'
done
생성된 파일은 다음과 같습니다.
IN_DIR = /data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/namesorted_bams
list_samples = $(shell ls $(IN_DIR)/*$(1)* $(IN_DIR)/*$(2)* $(IN_DIR)/*$(3)* | sed 's/\.namesorted\.bam/\.gene\.read\.count/g')
#SAMPLES_OUT := $(call list_samples,AON_9,NT_1,SC_17)
all: $(SAMPLES_OUT)
GFF := /data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me1.gff
GFF_TEMP := $(GFF).temp.gff
$(GFF_TEMP): $(GFF)
sed 's/\*/./g' $< > $@
%.gene.read.count: %.namesorted.bam $(GFF_TEMP)
htseq-count -t exon -m intersection-strict -f bam -r name -s no $^ > $@
동일한 배열의 변수 2개를 makefile에 전달하려고 하는데 bash 스크립트 배열 목록에서 이 작업을 수행하면 작동하지 않는 것 같습니다.
'$(call list_samples,AON_9,NT_1,SC_17) GFF=/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me1.gff'
불행히도 makefile은 이 구조를 처리할 수 없는 것 같습니다. 명령줄 문제 없이 이 두 변수를 makefile에 어떻게 전달할 수 있습니까? 그렇다면 $(call)이 명령줄 호출로 간주되는 것을 피하는 방법은 무엇입니까? makefile에 전달하려는 변수 2개는 GFF와 SAMPLES_OUT입니다.
답변1
Bash는 중첩 배열이나 기타 복잡한 데이터 구조를 지원하지 않습니다.
그러나 매개변수의 개수가 알려져 있으므로 각 매개변수에 대해 하나씩 두 개의 배열을 만들 수 있습니다.
#!/bin/bash
samples=(
'$(call list_samples,AON_9,NT_1,SC_17)'
'$(call list_samples,AON_10,NT_2,SC_18)'
'$(call list_samples,AON_11,NT_3,SC_19)'
'$(call list_samples,AON_12,NT_4,SC_20)'
'$(call list_samples,AON_13,NT_5,SC_21)'
)
gff=(
/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me1.gff
/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me2.gff
/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me3.gff
/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me4.gff
/data/DIV5/SASC/project-013-motor/analysis/runs/BWA_chipcap/BAMS/GFF/H3K4me5.gff
)
for (( idx=0; idx<${#samples[@]}; ++idx )) ; do
make -f make_gene_read_count.mk -n SAMPLES_OUT="${samples[idx]}" GFF="${gff[idx]}"
done