Chặn nhận xét trong Shell Script


250

Có cách nào đơn giản để nhận xét một khối mã trong tập lệnh shell không?


2
Thật thú vị khi câu hỏi dễ dàng và đơn giản như vậy có câu trả lời quá khác biệt và phức tạp.
Sigur

Câu trả lời:


348

Trong bash:

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

Ví dụ ''xung quanh ENDdấu phân cách là quan trọng, nếu không, những thứ bên trong khối như ví dụ $(command)sẽ được phân tích cú pháp và thực thi.

Để giải thích, xem điều này và câu hỏi này .


24
Thủ thuật dễ thương - miễn là từ khóa 'END' (dĩ nhiên là do người dùng chọn) không xuất hiện trên một dòng riêng bên trong tài liệu được nhận xét.
Jonathan Leffler

9
@kalengi: Vâng; từ được sử dụng trong dấu ngoặc kép có thể là bất cứ điều gì thuận tiện; EOFlà một ví dụ cổ điển (và do đó là !, một dấu chấm than trên riêng của mình), nhưng bạn có thể sử dụng SNURFLE_BURGERShoặc classical_end_markerhoặc bất kỳ từ nào khác mà không xuất hiện trên một dòng trên riêng của mình trong các tài liệu nhận xét-out. Tôi không muốn thử nghiệm các không gian, v.v., nhưng từ này cũng có thể hoạt động với chúng.
Jonathan Leffler

4
Nó chắc chắn hoạt động nhưng bất cứ ai có thể giải thích về cách thức này hoạt động? Cảm ơn
mbbce 14/05/2015

5
@MB_CE, xem stackoverflow.com/questions/32126653/ . Điều đó nói rằng - nó đang chạy một lệnh ( :) không đọc đầu vào của nó và luôn thoát với giá trị thành công và gửi "nhận xét" làm đầu vào. Không nhiều lắm
Charles Duffy

2
Tôi cho rằng nó cực kỳ xấu xí và khó hiểu khi viết mã hoạt động để tạo mã thụ động ... chỉ cần sử dụng chế độ chọn khối cũ tốt và nhấn #; Vấn đề lớn với điều đó là gì?
Rusty75

90

Không có bình luận khối trên kịch bản shell.

Sử dụng vi(có, vi) bạn có thể dễ dàng nhận xét từ dòng n đến m

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

(đọc, từ dòng 10 đến 100 bắt đầu dòng thay thế (^) bằng dấu #.)

và bỏ bình luận với

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

(đọc, từ dòng 10 đến 100 bắt đầu dòng thay thế (^) theo sau là # với ghi chú //.)

vilà gần như phổ quát bất cứ nơi nào có /bin/sh.


Thủ thuật hay với biểu thức chính quy trên vi để đặt # trước dòng.
Atiq Rahman

5
Chỉ là một mẹo - nếu bạn đang sử dụng vim và điều này kết thúc làm nổi bật phần đầu của mỗi dòng, hãy thêm |nohvào cuối. Các ống phân tách các lệnh bổ sung và nohlà cho nohighlight. Làm nổi bật cụm từ tìm kiếm sẽ tự động tiếp tục trong lần tiếp theo bạn tìm kiếm thứ gì đó. Ví dụ::10,100s/^/#/g|noh
Matthew

Tôi cần điều này để được tự động hóa từ một kịch bản. Có cách nào để làm điều đó với một tệp với vi mà không cần sự tương tác của con người không?
Timothy Swan

1
@TimothySwan Tôi tưởng tượng chương trình gawk hoặc sed có thể làm điều đó ... bằng cách nào đó.
BeowulfNode42

cách bình luận ưa thích của tôi (hoặc tiền tố) một khối với vi: đi đến đầu dòng bạn muốn bắt đầu bình luận (ví dụ <SHIFT>+G 10 <ENTER>sau đó 0hoặc bằng bất kỳ cách nào khác để điều hướng). Sau đó sử dụng <CTRL>+Vđể vào chế độ khối trực quan và tô sáng phần đầu của tất cả các dòng bạn muốn nhận xét (trong ví dụ này 90 J). Sau đó nhấn SHIFT+Iđể chèn trước khối được tô sáng. Nhập dấu hiệu nhận xét (ví dụ #) và nhấn <ESC>để hoàn thành tiền tố của bạn. Lời giải thích này nghe có vẻ siêu dài, nhưng theo kinh nghiệm của tôi thì nó nhanh hơn nhiều trong thực tế.
Ueffes

52

Bạn có thể dùng:

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
Đây là cổ điển, nhưng như stackoverflow.com/a/19409316/832230 ghi chú, if [ ];cũng hoạt động.
Acumenus

12
Có lẽ rõ ràng hơn : if false;. stackoverflow.com/a/18019516/2097284
Camille Goudeseune

3
Điều này dường như chỉ hoạt động là văn bản nhận xét là mã thực sự. Tôi gặp vấn đề với các bình luận với đường ống và dấu chấm phẩy. Câu trả lời của Sunny256 đã có hiệu quả.
swdev

thậm chí ngắn gọn hơn sẽ là []; sử dụng bài kiểm tra đó là
Justin Duncan

27

Sau đây nên làm việc cho sh, bash, kshzsh.

Các khối mã được nhận xét có thể được đặt bên trong BEGINCOMMENTENDCOMMENT:

[ -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"

Thực thi mã trên sẽ dẫn đến:

This is outside the commented block

Để bỏ ghi chú các khối mã do đó đã nhận xét, hãy nói

alias BEGINCOMMENT="if : ; then"

thay vì

alias BEGINCOMMENT="if [ ]; then"

trong ví dụ trên.


23

nếu bạn có thể né tránh các trích dẫn duy nhất:

__='
blah blah comment.
'

Tôi thích điều này. Dấu gạch dưới đôi có nghĩa là gì? Theo cách tốt nhất tôi có thể nói đó chỉ là một tên biến bằng cách sử dụng quy ước rằng nó nên được coi là riêng tư?
cờ vua

Cũng cung cấp tô sáng cú pháp trong hầu hết các trình soạn thảo và có thể gọi được nếu cần với $ __ mặc dù tôi sẽ đề xuất một tên biến như tài liệu hoặc tài liệu cho rõ ràng.
jasonleonhard

Bạn cũng có thể thêm từ địa phương vào trước ref tại đây
jasonleonhard

Đây phải là câu trả lời tốt nhất. Chỉ cần đặt một số tên biến giả thay vì dấu gạch dưới kép
B Abali

Đã thử điều này, nhưng thất bại vì có một -F ';' bên trong khối để bình luận ra.
yO_


14

Trong Vim:

  1. đi đến dòng đầu tiên của khối bạn muốn bình luận
  2. shift-V (vào chế độ trực quan), lên xuống các dòng tô sáng trong khối
  3. thực hiện như sau trên lựa chọn :s/^/#/
  4. lệnh sẽ trông như thế này:

      :'<,'>s/^/#
  5. Nhấn Enter

ví dụ

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

7
Để sử dụng uncomment:s/^#/
Buge

Kiểm tra câu trả lời của @ horta: stackoverflow.com/a/28376319/3506015 - thậm chí còn có ít lần nhấn phím hơn!
geedoubleya

4

Bạn có thể sử dụng chế độ Visual Block của Vi / Vim được thiết kế cho những thứ như thế này:

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

Sự thiếu sót sẽ là:

Ctrl-V  
Highlight #'s  
d  
l  

Đây là cách tương tác của vi để thực hiện loại việc này thay vì đếm hoặc đọc số dòng.

Cuối cùng, trong Gvim, bạn sử dụng ctrl-q để vào chế độ Visual Block thay vì ctrl-v (vì đó là lối tắt để dán).


Yêu phương pháp đơn giản này. : o)
geedoubleya

4

Thành thật mà nói, tại sao quá nhiều ...

Tôi coi đó thực sự là một cách thực hành tồi để viết mã hoạt động để tạo mã thụ động.

Giải pháp của tôi: hầu hết các biên tập viên đều có chế độ chọn khối. Chỉ cần sử dụng nó để thêm # vào tất cả các dòng bạn muốn nhận xét. Chuyện lớn là gì ...

Ví dụ về Notepad:

Để tạo: Alt - mousedrag xuống, nhấn #.

Để xóa: Alt-mousedrag xuống, mũi tên sang phải, xóa.


8
Người dùng rất có thể là trong thiết bị đầu cuối. Không thể giả sử một môi trường chuột.
Gary

Họ có còn tồn tại không? Tôi thường chỉnh sửa trong chế độ đồ họa và dán lại bằng cách sử dụng vi, đó sẽ là một cách giải quyết dễ dàng.
Rusty75

2

Một biến thể của thủ thuật here-doc trong câu trả lời được chấp nhận bởi sunny256 là sử dụng các từ khóa Perl để bình luận. Nếu bình luận của bạn thực sự là một loại tài liệu, thì bạn có thể bắt đầu sử dụng cú pháp Perl bên trong khối nhận xét, cho phép bạn in nó ra được định dạng độc đáo, chuyển đổi nó thành trang man, v.v.

Đối với vỏ có liên quan, bạn chỉ cần thay thế 'END'bằng '=cut'.

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

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

etc.

=cut
echo "after comment"

(Tìm thấy trên " Tài liệu nhúng trong tập lệnh shell ")


0

Một chế độ khác là: Nếu trình soạn thảo của bạn KHÔNG có tùy chọn nhận xét BLOCK,

  1. Mở phiên bản thứ hai của trình chỉnh sửa (ví dụ: Tệp => Tệp mới ...)
  2. Từ tệp PREVIOUS bạn đang làm việc, chọn CHỈ MỘT PHẦN BẠN MUỐN COMMENT
  3. Sao chép và dán nó vào cửa sổ của tệp tạm thời mới ...
  4. Mở menu Chỉnh sửa, chọn THAY THẾ và nhập dưới dạng chuỗi cần thay thế '\ n'
  5. đầu vào dưới dạng chuỗi thay thế: '\ n #'
  6. nhấn nút 'thay TẤT CẢ'

LÀM XONG

nó hoạt động với bất kỳ biên tập viên


0

Tôi thích một dòng duy nhất mở và đóng:

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

'##' giúp tôi dễ dàng tìm thấy điểm bắt đầu và kết thúc của nhận xét khối. Tôi có thể dính một số sau '##' nếu tôi có một loạt chúng. Để tắt nhận xét, tôi chỉ cần dán '1' vào '[]'. Tôi cũng tránh một số vấn đề tôi gặp phải với dấu ngoặc đơn trong khối nhận xét.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.