บล็อกความคิดเห็นใน Shell Script


250

มีวิธีง่าย ๆ ในการคอมเม้นท์บล็อกของรหัสในเชลล์สคริปต์หรือไม่?


2
น่าสนใจว่าคำถามที่ง่ายและเรียบง่ายนั้นมีคำตอบที่แตกต่างและซับซ้อนเกินไป
Sigur

คำตอบ:


348

ในทุบตี:

#!/bin/bash
echo before comment
: <<'END'
bla bla
blurfl
END
echo after comment

'และ'รอบ ๆENDตัวคั่นมีความสำคัญมิฉะนั้นสิ่งที่อยู่ภายในบล็อกเช่นตัวอย่าง$(command)จะถูกแยกและดำเนินการ

สำหรับคำอธิบายให้ดูนี้และนี้คำถาม


24
เคล็ดลับน่ารัก - ตราบใดที่คำหลัก 'END' (ซึ่งแน่นอนว่าผู้ใช้เลือก) จะไม่ปรากฏในบรรทัดของเนื้อหาภายในที่จะแสดงความคิดเห็น
Jonathan Leffler

9
@kalengi: ใช่; คำที่ใช้ในเครื่องหมายคำพูดสามารถเป็นอะไรก็ได้ที่สะดวก EOFเป็นตัวอย่างแบบคลาสสิก (และเป็น!เครื่องหมายอัศเจรีย์ของตัวเอง) แต่คุณสามารถใช้SNURFLE_BURGERSหรือclassical_end_markerหรือคำอื่น ๆ ที่ไม่ปรากฏบนบรรทัดของตัวเองในเนื้อหาที่มีการแสดงความคิดเห็น ฉันลังเลที่จะทดลองกับที่ว่าง ฯลฯ แต่คำอาจใช้ได้กับพวกเขาเช่นกัน
Jonathan Leffler

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

5
@MB_CE ดูstackoverflow.com/questions/32126653/... ที่กล่าวว่า - มันใช้คำสั่ง ( :) ที่ไม่อ่านอินพุตและออกจากค่าที่ประสบความสำเร็จเสมอและส่ง "comment" เป็นอินพุต ไม่มากไป
ชาร์ลส์ดัฟฟี่

2
ฉันคิดว่ามันน่าเกลียดอย่างไม่น่าเชื่อและสับสนในการเขียนรหัสที่ใช้งานเพื่อสร้างรหัสแฝง ... เพียงแค่ใช้โหมดบล็อกเลือกเก่าที่ดีและกด #; ปัญหาใหญ่ของสิ่งนั้นคืออะไร?
Rusty75

90

ไม่มีความคิดเห็นแบบบล็อกบนเชลล์สคริปต์

ใช้vi(ใช่vi) คุณสามารถแสดงความคิดเห็นได้อย่างง่ายดายจากบรรทัดnถึงm

<ESC>
:10,100s/^/#/

(ที่อ่านมาจากบรรทัดที่ 10 ถึง 100 การแทนที่บรรทัดเริ่มต้น (^) ด้วยเครื่องหมาย #)

และยกเลิกการแสดงความคิดเห็นด้วย

<ESC>
:10,100s/^#//

(ที่อ่านมาจากบรรทัดที่ 10 ถึง 100 การแทนที่บรรทัดเริ่มต้น (^) ตามด้วย # ด้วย noting //.)

vi/bin/shเป็นได้ทุกที่เกือบจะเป็นสากลที่มี


เคล็ดลับดี ๆ ที่มีการแสดงออกปกติบน vi เพื่อวาง # ไว้ด้านหน้าของบรรทัด
Atiq Rahman

5
เพียงแค่ปลายนิ้วหากคุณใช้เสียงเรียกเข้าและท้ายที่สุดการเน้นจุดเริ่มต้นของทุกบรรทัดให้เพิ่ม|nohไปยังจุดสิ้นสุด nohไพพ์แยกคำสั่งเพิ่มเติมและใช้สำหรับไฮไลต์ การเน้นข้อความค้นหาจะกลับมาทำงานโดยอัตโนมัติในครั้งต่อไปที่คุณค้นหาบางสิ่ง ตัวอย่าง::10,100s/^/#/g|noh
Matthew

ฉันต้องการสิ่งนี้โดยอัตโนมัติจากสคริปต์ มีวิธีการทำเช่นนั้นกับไฟล์ที่มี vi โดยไม่จำเป็นต้องมีการโต้ตอบกับมนุษย์หรือไม่?
Timothy Swan

1
@ TimothySwan ฉันคิดว่าโปรแกรมเพ่งพิศหรือ sed สามารถทำอย่างนั้น ... อย่างใด
BeowulfNode42

วิธีที่ฉันต้องการแสดงความคิดเห็น (หรือนำหน้า) บล็อกที่มี vi: ไปที่จุดเริ่มต้นของบรรทัดที่คุณต้องการเริ่มแสดงความคิดเห็น (เช่น<SHIFT>+G 10 <ENTER>นั้น0หรือโดยวิธีอื่น ๆ เพื่อนำทาง) จากนั้นใช้<CTRL>+Vเพื่อเข้าสู่โหมดบล็อกภาพและเน้นจุดเริ่มต้นของทุกบรรทัดที่คุณต้องการแสดงความคิดเห็น (ในตัวอย่างนี้90 J) จากนั้นกดSHIFT+Iเพื่อแทรกหน้าบล็อกที่ไฮไลต์ ป้อนสัญลักษณ์ความคิดเห็น (เช่น#) และกด<ESC>เพื่อสิ้นสุดคำนำหน้า คำอธิบายนี้ฟังดูยาวมาก แต่จากประสบการณ์ของฉันมันเร็วกว่ามากในทางปฏิบัติ
Ueffes

52

คุณสามารถใช้ได้:

if [ 1 -eq 0 ]; then
  echo "The code that you want commented out goes here."
  echo "This echo statement will not be called."
fi

14
นี่เป็นแบบคลาสสิค แต่เป็นstackoverflow.com/a/19409316/832230โน้ตเพียงใช้if [ ];งานได้เช่นกัน
คิวเมนตัส

12
if false;บางทีอาจจะเป็นที่ชัดเจน: stackoverflow.com/a/18019516/2097284
Camille Goudeseune

3
ดูเหมือนว่าจะใช้งานได้เท่านั้นคือข้อความที่ใส่ความเห็นเป็นรหัสจริง ฉันพบปัญหาเกี่ยวกับความคิดเห็นที่มีท่อและอัฒภาค Sunny256 คำตอบทำงาน
swdev

รัดกุมยิ่งขึ้นจะเป็น []; ใช้การทดสอบนั่นคือ
จัสตินดันแคน

27

ต่อไปนี้ควรทำงานsh, bash, และkshzsh

บล็อกของรหัสที่จะแสดงความคิดเห็นสามารถใส่ข้างในBEGINCOMMENTและENDCOMMENT:

[ -z $BASH ] || shopt -s expand_aliases
alias BEGINCOMMENT="if [ ]; then"
alias ENDCOMMENT="fi"

BEGINCOMMENT
  echo "This line appears in a commented block"
  echo "And this one too!"
ENDCOMMENT

echo "This is outside the commented block"

การใช้โค้ดข้างต้นจะส่งผลให้:

This is outside the commented block

เพื่อยกเลิกการคอมเม้นต์บล็อกรหัสจึงแสดงความคิดเห็นพูด

alias BEGINCOMMENT="if : ; then"

แทน

alias BEGINCOMMENT="if [ ]; then"

ในตัวอย่างด้านบน


23

หากคุณสามารถหลบราคาเดียว:

__='
blah blah comment.
'

ฉันชอบสิ่งนี้. ขีดเส้นใต้คู่หมายถึงอะไร ดีที่สุดที่ฉันสามารถบอกได้ว่ามันเป็นเพียงชื่อตัวแปรโดยใช้แบบแผนที่ควรถือว่าเป็นส่วนตัวหรือไม่
chessofnerd

นอกจากนี้ยังมีการเน้นไวยากรณ์ในโปรแกรมแก้ไขส่วนใหญ่และสามารถเรียกใช้ถ้าจำเป็นด้วย $ __ แม้ว่าฉันจะแนะนำชื่อตัวแปรเช่นเอกสารหรือเอกสารเพื่อความชัดเจน
jasonleonhard

นอกจากนี้คุณยังสามารถเพิ่มคำต่อท้ายคำอ้างอิง
jasonleonhard

นี่ควรเป็นคำตอบที่ดีที่สุด เพียงแค่ใส่ชื่อตัวแปรจำลองบางตัวแทนเครื่องหมายขีดล่างคู่
B Abali

พยายามทำสิ่งนี้ แต่ล้มเหลวเนื่องจากมี -F ';' ด้านในของบล็อกเพื่อแสดงความคิดเห็น
yO_

15

ใช้: 'เพื่อเปิดและ'ปิด

ตัวอย่างเช่น:

: '
This is a
very neat comment
in bash
'

นี่คือจากตัวอย่างของสเวกัสพบได้ที่นี่


2
Hack

มันเป็นสิ่งที่ดีที่สุดสำหรับฉัน
DPalharini

14

ในกลุ่ม:

  1. ไปที่บรรทัดแรกของบล็อกที่คุณต้องการแสดงความคิดเห็น
  2. shift-V (เข้าสู่โหมดแสดงภาพ) ขึ้นบรรทัดไฮไลต์ลงในบล็อก
  3. ดำเนินการต่อไปนี้ในการเลือก :s/^/#/
  4. คำสั่งจะมีลักษณะเช่นนี้:

      :'<,'>s/^/#
  5. กด Enter

เช่น

shift-V
jjj
:s/^/#
<enter>

7
หากต้องการยกเลิกการใช้งาน:s/^#/
Buge

ตรวจสอบคำตอบ @ horta ของ: stackoverflow.com/a/28376319/3506015 - มีการกดปุ่มน้อยลง!
geedoubleya

4

คุณสามารถใช้โหมด Visual Block ของ Vi / Vim ซึ่งออกแบบมาสำหรับสิ่งต่าง ๆ ดังนี้:

Ctrl-V  
Highlight first element in rows you want commented  
Shift-i  
#  
esc  

ความคิดเห็นจะเป็น:

Ctrl-V  
Highlight #'s  
d  
l  

นี่เป็นวิธีการโต้ตอบของ vi ในการทำสิ่งนี้แทนที่จะนับหรืออ่านหมายเลขบรรทัด

สุดท้ายใน Gvim คุณใช้ ctrl-q เพื่อเข้าสู่โหมด Visual Block แทน ctrl-v (เพราะเป็นทางลัดสำหรับวาง)


รักวิธีการง่าย ๆ นี้ : o)
geedoubleya

4

ในความซื่อสัตย์ทั้งหมดทำไม overengineering มาก ...

ฉันคิดว่าเป็นวิธีปฏิบัติที่ไม่ดีในการเขียนรหัสที่ใช้งานอยู่เพื่อสร้างรหัสแฝง

โซลูชันของฉัน: บรรณาธิการส่วนใหญ่มีโหมดเลือกบล็อก เพียงใช้เพื่อเพิ่ม # ให้กับทุกบรรทัดที่คุณต้องการแสดงความคิดเห็น เรื่องใหญ่อะไร ...

ตัวอย่าง Notepad:

วิธีสร้าง: Alt - mousedrag down กด #

ในการลบ: Alt-mousedrag down, ลูกศร shift-right, ลบ


8
ผู้ใช้ส่วนใหญ่อยู่ในอาคารผู้โดยสาร ไม่สามารถสมมติสภาพแวดล้อมของเมาส์
Gary

พวกเขายังคงมีอยู่? ฉันมักจะแก้ไขในโหมดกราฟิกและวางกลับโดยใช้ vi ซึ่งจะเป็นการแก้ปัญหาง่าย
Rusty75

2

ความแตกต่างของเคล็ดลับ here-doc ในคำตอบที่ได้รับการยอมรับโดย sunny256 คือการใช้คีย์เวิร์ด Perl สำหรับความคิดเห็น หากความคิดเห็นของคุณเป็นเอกสารจริง ๆ คุณสามารถเริ่มใช้ไวยากรณ์ Perl ในบล็อกคอมเม้นต์ซึ่งช่วยให้คุณสามารถพิมพ์ออกมาในรูปแบบที่เหมาะสมแปลงเป็นหน้าคนเป็นต้น

เท่าที่เปลือกเป็นห่วงคุณจะต้องเปลี่ยนด้วย'END''=cut'

echo "before comment"
: <<'=cut'
=pod

=head1 NAME
   podtest.sh - Example shell script with embedded POD documentation

etc.

=cut
echo "after comment"

(พบใน " เอกสารฝังในเชลล์สคริปต์ ")


0

โหมดอื่นคือ: หากตัวแก้ไขของคุณมีตัวเลือกความคิดเห็นไม่บล็อก

  1. เปิดอินสแตนซ์ที่สองของเครื่องมือแก้ไข (ตัวอย่างเช่นไฟล์ => ไฟล์ใหม่ ... )
  2. จากไฟล์ก่อนหน้านี้ที่คุณกำลังทำงานให้เลือกเฉพาะส่วนที่คุณต้องการแสดงความคิดเห็น
  3. คัดลอกและวางไว้ในหน้าต่างของไฟล์ชั่วคราวใหม่ ...
  4. เปิดเมนูแก้ไขเลือก REPLACE และป้อนข้อมูลเป็นสตริงเพื่อแทนที่ '\ n'
  5. อินพุตเป็นการแทนที่สตริง: '\ n #'
  6. กดปุ่ม 'แทนที่ทั้งหมด'

DONE

มันทำงานร่วมกับบรรณาธิการใด ๆ


0

ฉันชอบบรรทัดเดียวเปิดและปิด:

if [ ]; then ##
    ...
    ...
fi; ##

'##' ช่วยให้ฉันค้นหาจุดเริ่มต้นและจุดสิ้นสุดของความคิดเห็นบล็อกได้อย่างง่ายดาย ฉันสามารถติดตัวเลขหลัง '##' ถ้าฉันมีพวกมันมากมาย หากต้องการปิดความคิดเห็นฉันเพียงติด '1' ใน '[]' ฉันยังหลีกเลี่ยงปัญหาบางอย่างที่ฉันเคยมีด้วยคำพูดเดียวในบล็อกที่มีความคิดเห็น

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