ฉันจะปรับโครงสร้างโค้ด bash นี้เพื่อให้ฉันสามารถแสดงความคิดเห็นในแต่ละคำสั่งได้อย่างไร


3

ฉันมีสายของการทุบตี:

SAMPLES=$(for f in `find $IN -iname *fastq.gz `; do basename $f | cut -c 1-4; done | sort | uniq)

ซึ่งฉันพยายามแบ่งออกเป็นหลายบรรทัดเพื่อจุดประสงค์ในการแสดงความคิดเห็นแต่ละข้อ ฉันต้องการสิ่งต่อไปนี้พร้อมความคิดเห็นในแต่ละบรรทัดหรือหลังบรรทัด:

SAMPLES=
#comment
$(for f in `find $IN -iname *fastq.gz `; \ 
#comment
do basename $f |
#comment
cut -c 1-4; done | 
#comment
sort |
#comment
uniq)

ฉันเคยเห็นทั้งสองสิ่งนี้และสิ่งนี้แต่พวกเขาไม่มีการ$()ประเมินผลหรือสำหรับลูปซึ่งทำให้ฉันหมดแรง การป้อนข้อมูลใด ๆ ชื่นชม

คำตอบ:


1

คุณต้องทำสิ่งนี้:

SAMPLES=$(for f in `find $IN -iname *fastq.gz `; #comment \
do basename $f | #comment \
cut -c 1-4; done |  #comment \
sort | #comment \
uniq)

สิ่งนี้ใช้งานได้เนื่องจากความคิดเห็นสิ้นสุดที่บรรทัดใหม่\และแยกวิเคราะห์คำสั่งที่จุดเริ่มต้นของบรรทัดถัดไป


อืม ... ดังนั้น \ จะไม่ถูกถือว่าเป็นส่วนหนึ่งของความคิดเห็นใช่ไหม ที่นี่ ( superuser.com/questions/641952/… ) OP บอกว่าเขาไม่สามารถทำได้
rivanov

@rivanov ความคิดเห็นจะต้องมีการวางไว้ก่อนที่จะหนีการขึ้นบรรทัดใหม่เพื่อให้ได้รับการประเมิน ข้อผิดพลาดที่คุณเชื่อมโยงนั้นเป็นเพราะความคิดเห็นกำลังได้รับการประเมินหลังจากขึ้นบรรทัดใหม่ทำให้โมฆะทั้งบรรทัดเป็นความคิดเห็น
td512

3

คุณสามารถใช้ไวยากรณ์ที่คุณต้องการ แต่สำหรับบรรทัดแรก ถ้าคุณเขียน

SAMPLE=

จากนั้น SAMPLE ตัวแปรจะถูกตั้งค่าเป็นสตริงว่าง แต่ถ้าคุณเขียน

SAMPLE=$(

จากนั้นล่ามจะค้นหาวงเล็บปิดเพื่อจบคำสั่ง นั่นคือคุณสามารถเขียน:

SAMPLES=$(
#comment
for f in $(find . -name *fastq.gz) ;
#comment
do
# comment
basename $f |
#comment
cut -c 1-4
done |
#comment
sort |
uniq)

(BTW คุณสามารถซ้อน$()เพื่อหลีกเลี่ยงไวยากรณ์ backquote ที่เก่ากว่า)


นั่นลึกซึ้ง ดังนั้นdoneจะต้องอยู่ในสายของตัวเอง?
rivanov

เสร็จสามารถอยู่คนเดียวในบรรทัดหรือคั่นด้วย ';' จากคำสั่งก่อนหน้า
MaxP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.