bash를 사용하여 Makefile에 2개의 변수 전달

bash를 사용하여 Makefile에 2개의 변수 전달

내 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

관련 정보