Variable

Here-document 有兩個變數

  • February 4, 2022

嘗試使用 here-document 的兩個變數來生成 bash 腳本列表。我遇到的問題是我無法將兩個變數正確放入腳本中,並且輸出文件(只有一個文件)的文件名為cut_cat.sh,基本上程式碼被解釋為 cat 為文本,而不是函式。我該如何改進呢?

這是在 bash shell 環境中。作業系統是紅帽 Linux。

輸入文件R2_adaptor包含Sample_ID:CGATATTCG(前半部分是樣本 ID,後半部分是要移除的序列)。它們由 分隔:

   for n in cat ${FA_PATH}/R2_adaptor;
 do first=$(echo $n | cut -d ":" -f 1) 
 second=$(echo $n | cut -d ":" -f 2) 
 cat <<- EOF > ${SCRIPTS}/cut_${first}.sh
   #!/bin/bash
   
   FA_PATH="/home/xxx/test_files"
   
   cutadapt -a TTCCTCCT -A echo ${second} --cores=14 \
   -o ${FA_PATH}/${first}_R1_trim.fastq.gz \
   -p ${FA_PATH}/${first}_R2_trim.fastq.gz \
   ${FA_PATH}/${first}_R1_001.fastq.gz ${FA_PATH}/${first}_R2_001.fastq.gz 
   
   
   EOF
   done

這是 ${FA_PATH}/R2_adaptor文件的範例

Sample2:AGAAGTTT
Sample3:TTGGATAT
Sample4:GTAGTATT
Sample5:ATATATAT
Sample6:AACTTGGC
Sample7:GATGGTGA
Sample8:GTCCCTAT

其中很多都是猜測,因為您根本沒有告訴我們任何細節,但我認為${FA_PATH}/R2_adaptor會擴展為文件名,我認為您要做的是迭代文件的內容。這意味著您可能正在尋找的是for n in $(cat ${FA_PATH}/R2_adaptor).

但是,儘管如果每行只有一個字元串,這在這裡會起作用,但最好while習慣於對這樣的事情使用循環。

我再次猜測您的輸入文件有兩個由 分隔的字元串:,例如:

ACTTGCTATAGCGAT:CGATATTCGGCGATAT

如果是這樣,您可以這樣做:

#!/bin/bash

FA_PATH="/home/xxx/test_files"
SCRIPTS="/path/to/scripts"

while IFS=: read -r first second rest_if_any_ignored; do
 cat <<- EOF > "${SCRIPTS}"/cut_"${first}".sh
#!/bin/bash

cutadapt -a TTCCTCCT -A '${second}' --cores=14 \
-o '${FA_PATH}/${first}_R1_trim.fastq.gz' \
-p '${FA_PATH}/${first}_R2_trim.fastq.gz' \
'${FA_PATH}/${first}_R1_001.fastq.gz' 
'${FA_PATH}/${first}_R2_001.fastq.gz' 
EOF
done < "${FA_PATH}"/R2_adaptor 

請注意,我還刪除了echofrom,-A echo $second因為echo那裡只是一個字元串,並且-A期望刪除一個適配器序列。

引用自:https://unix.stackexchange.com/questions/689281