ฉันเพิ่งเริ่มศึกษาเชลล์สคริปต์และฉันต้องการที่จะแสดงความคิดเห็นชุดของบรรทัดในเชลล์สคริปต์ ฉันหมายถึงชอบในกรณีของ C / Java:
/* comment1
comment2
comment3
*/`
ฉันจะทำสิ่งนั้นได้อย่างไร
:
อยู่ในคอลัมน์แรก (ไม่มีช่องว่างนำหน้า) ในบรรทัด
ฉันเพิ่งเริ่มศึกษาเชลล์สคริปต์และฉันต้องการที่จะแสดงความคิดเห็นชุดของบรรทัดในเชลล์สคริปต์ ฉันหมายถึงชอบในกรณีของ C / Java:
/* comment1
comment2
comment3
*/`
ฉันจะทำสิ่งนั้นได้อย่างไร
:
อยู่ในคอลัมน์แรก (ไม่มีช่องว่างนำหน้า) ในบรรทัด
คำตอบ:
ใช้: '
เพื่อเปิดและ'
ปิด
ตัวอย่างเช่น:
: '
This is a
very neat comment
in bash
'
#
และไม่เคยทำเช่นนี้ ...
:
มีการจดชวเลขtrue
และtrue
ไม่ได้ประมวลผลพารามิเตอร์ใด ๆ (หน้าคู่มือ:SYNOPSIS true [ignored command line arguments]
:
และ'
เป็นสิ่งสำคัญ
# '
ในบรรทัดสุดท้ายแทนคำพูดเดียว ด้วยวิธีนี้ฉันสามารถใส่หนึ่ง#
ในบรรทัดแรกเพื่อเปิดใช้งานบล็อกของรหัส ลบ#
บรรทัดแรกเพื่อปิดการใช้งานรหัส
แสดงความคิดเห็นหลายบรรทัดในทุบตี
: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines. Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2
comment3
END_COMMENT
:
ไม่จำเป็น <<
เพียงแค่เริ่มต้นด้วย
ฉันกำลังอัปเดตโพสต์นี้ตามความคิดเห็นและคำตอบอื่น ๆ ดังนั้นความคิดเห็นก่อน 22 พฤษภาคม 2020 อาจไม่สามารถใช้งานได้อีกต่อไป
Bash ไม่ได้มีไวยากรณ์ในตัวสำหรับความคิดเห็นแบบหลายบรรทัด แต่มีแฮ็กที่ใช้ไวยากรณ์ของ bash ที่มีอยู่ซึ่ง "เกิดขึ้นกับการทำงานตอนนี้"
โดยส่วนตัวแล้วฉันคิดว่าสิ่งที่ง่ายที่สุด (เช่นเสียงรบกวนน้อยที่สุด, แปลกน้อยที่สุด, ง่ายที่สุดในการพิมพ์, ชัดเจนที่สุด) คือการใช้ HEREDOC ที่ยกมา แต่ให้ชัดเจนว่าคุณกำลังทำอะไรอยู่และใช้เครื่องหมาย HEREDOC เดียวกันทุกที่:
<<'### BLOCK COMMENT'
line 1
line 2
line 3
line 4
### BLOCK COMMENT
Single-quoting the marker HEREDOC หลีกเลี่ยงการแยกผลข้างเคียงของเชลล์เช่นการย่อยแบบแปลก ๆ ที่อาจทำให้เกิดความผิดพลาดหรือเอาต์พุตและแม้แต่การแยกเครื่องหมายของตัวเอง ดังนั้นเครื่องหมายคำพูดเดียวให้อิสระคุณมากขึ้นในเครื่องหมายแสดงความคิดเห็นแบบเปิดปิด ตัวอย่างเช่นต่อไปนี้ใช้แฮชสามเท่าซึ่งชนิดของคำแนะนำแสดงความคิดเห็นหลายบรรทัดในทุบตี สิ่งนี้จะทำให้สคริปต์ขัดข้องหากไม่มีการเสนอราคาเดียว แม้ว่าคุณจะลบออก###
แต่FOO{}
ก็จะทำให้สคริปต์ผิดพลาด (หรือทำให้เกิดการแทนที่ที่ไม่ดีที่จะพิมพ์หากไม่มีset -e
) หากไม่ได้ใช้เครื่องหมายคำพูดเดี่ยว:
set -e
<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT
ls
แน่นอนคุณสามารถใช้
set -e
<<'###'
something something ${FOO{}} something
more comment
###
ls
แต่เจตนาของเรื่องนี้ชัดเจนน้อยกว่าสำหรับผู้อ่านที่ไม่คุ้นเคยกับกลอุบายนี้
ทุกวันนี้เครื่องมือแก้ไขที่ดีจะอนุญาตให้คุณกด ctrl- / หรือคล้ายกันเพื่อยกเลิก / แสดงความคิดเห็นการเลือก ทุกคนเข้าใจสิ่งนี้อย่างแน่นอน:
# something something ${FOO{}} something
# more comment
# yet another line of comment
แม้ว่าจะเป็นที่ยอมรับ แต่ก็ไม่สะดวกเท่ากับความคิดเห็นบล็อกด้านบนหากคุณต้องการเติมย่อหน้าของคุณอีกครั้ง
แน่นอนว่ามีเทคนิคอื่น ๆ แต่ดูเหมือนจะไม่มีวิธี "ธรรมดา" ที่จะทำ มันจะดีถ้า###>
และ###<
สามารถเพิ่มลงใน bash เพื่อระบุจุดเริ่มต้นและจุดสิ้นสุดของบล็อกความคิดเห็นดูเหมือนว่ามันจะค่อนข้างตรงไปตรงมา
true
) แม้ว่าพวกเขาจะไม่สวมก็ตาม ไม่เสี่ยงต่อการถูกทำลาย (วิธี heredoc ไม่ได้ แต่รุ่นโคลอนทำ), 1) แฮ็กยังคงทำให้งงงวยเจตนา: โดยไม่มีบรรทัดแรกบอกใบ้เกี่ยวกับความคิดเห็นหลายบรรทัดส่วนใหญ่จะเกาหัวของพวกเขาสงสัยว่ารหัสกำลังทำอะไร และ 2) มีมุมมืดที่ไม่คาดคิด (เช่นต้องเพิ่มเครื่องหมายคำพูดเป็นสองเท่าให้อ้างอิงเครื่องหมาย heredoc ในบางกรณี ฯลฯ )
${FOO:=bar}
${FOO{}}
ครั้งแรกอาจมีผลข้างเคียงในการสร้างและตั้งค่าตัวแปรFOO
ที่สองจะเพิ่ม ข้อผิดพลาดในการทดแทนที่ไม่ดี ; เอฟเฟกต์ทั้งสองที่คุณไม่คาดหวังจากความคิดเห็นจริง
หลังจากอ่านคำตอบอื่น ๆ ที่นี่ฉันมาด้วยด้านล่างซึ่ง IMHO ทำให้ชัดเจนจริงๆมันเป็นความคิดเห็น เหมาะอย่างยิ่งสำหรับข้อมูลการใช้งานในสคริปต์:
<< ////
Usage:
This script launches a spaceship to the moon. It's doing so by
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.
////
ในฐานะโปรแกรมเมอร์ลำดับของเครื่องหมายทับลงทะเบียนทันทีในสมองของฉันเป็นความคิดเห็น (แม้ว่าปกติจะใช้เครื่องหมายทับเพื่อแสดงความคิดเห็นในบรรทัด)
แน่นอน"////"
มันเป็นแค่สตริง จำนวนเครื่องหมายทับในส่วนนำหน้าและส่วนต่อท้ายต้องเท่ากัน
Usage:
<< EOF ... EOF
คุณมีความคิดเห็นต่อเรื่องนี้อย่างไร
function giveitauniquename()
{
so this is a comment
echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
1, for #((
2, this #wouldn't work either
function giveitadifferentuniquename()
{
echo nestable
}
}
นี่คือวิธีที่ฉันแสดงความคิดเห็นหลายบรรทัดในทุบตี
กลไกนี้มีข้อดีสองอย่างที่ฉันชื่นชม หนึ่งคือความคิดเห็นที่สามารถซ้อนกัน อีกอย่างคือบล็อกสามารถเปิดใช้งานได้โดยเพียงแค่แสดงความคิดเห็นในบรรทัดเริ่มต้น
#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A
ในตัวอย่างด้านบนบล็อก "B" ถูกใส่ความคิดเห็น แต่ส่วนของบล็อก "A" ที่ไม่ใช่บล็อก "B" จะไม่ได้รับการใส่ความคิดเห็น
การรันตัวอย่างนั้นจะสร้างเอาต์พุตนี้:
foo {
./example: line 5: fn: command not found
foo }
can't happen
ฉันลองคำตอบที่เลือกแล้ว แต่พบเมื่อฉันรันเชลล์สคริปมันทั้งหมดก็จะถูกพิมพ์ไปที่หน้าจอ (คล้ายกับว่าโน๊ตบุ๊ค jupyter พิมพ์ทุกอย่างด้วย'''xx'''
เครื่องหมายคำพูด) และมีข้อความแสดงข้อผิดพลาดในตอนท้าย มันก็ไม่ได้ทำอะไร แต่: น่ากลัว จากนั้นฉันก็รู้ว่าในขณะที่แก้ไขมันราคาเดียวสามารถขยายหลายบรรทัด ดังนั้น .. ขอเพียงแค่กำหนดบล็อกให้กับตัวแปร
x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"
ls -l
date
'
x=
ด้วย a :
และคุณมีเอฟเฟกต์เดียวกันโดยไม่มีผลข้างเคียง ข้อเสียเปรียบเพียงอย่างเดียวคือความคิดเห็นนั้นจะต้องไม่มีคำพูดเดียว นั่นเป็นเหตุผลที่ฉันชอบการใช้ heredoc ที่อ้างถึง: ด้วยสิ่งนี้ผู้แสดงความคิดเห็นสามารถเลือกสตริงการเลิกจ้างที่เหมาะสมตามที่เขาชอบ
วิธีแก้ปัญหาง่าย ๆ ไม่ฉลาดมาก:
บล็อกส่วนหนึ่งของสคริปต์ชั่วคราว:
if false; then
while you respect syntax a bit, please
do write here (almost) whatever you want.
but when you are
done # write
fi
รุ่นที่ซับซ้อนเล็กน้อย:
time_of_debug=false # Let's set this variable at the beginning of a script
if $time_of_debug; then # in a middle of the script
echo I keep this code aside until there is the time of debug!
fi
# ฉันชอบความเกียจคร้านและความเรียบง่าย ฉันใช้ # กับวิธีแก้ปัญหาตลก:
1 กด:] ค้นหา ctrl + F หรือ cmd + F หรืออะไรก็ตาม [เพื่อเรียกใช้ฟังก์ชันการค้นหา
2 ใช้ regex ในช่องค้นหาเช่น: (^.+)
3 แทนที่ด้วย: # $1
หรือหากคุณต้องการ#$1
# หมายเหตุ: คุณอาจไม่มีสามขั้นตอนในโปรแกรมแก้ไขของคุณ ในกรณีนั้นให้ใช้เครื่องมือ regex ออนไลน์ (ไม่สามารถแนะนำหนึ่งที่นี่เพื่อเหตุผลด้านนโยบาย):
(^.+)
เป็น regex และ#$1
หรือ#\1
เป็นรูปแบบการทดแทน# เพลิดเพลินกับแฮชของคุณ!
ctrl+/
ซึ่งจะสลับการแสดงความคิดเห็นในหรือนอกแม้กระทั่งสำหรับหลายบรรทัด นอกจากนี้ยังสามารถเปลี่ยนอักขระความคิดเห็นตามภาษาที่คุณใช้