Blokir Komentar dalam Skrip Shell

250

Apakah ada cara sederhana untuk mengomentari blok kode dalam skrip shell?

mereka memanggil saya
sumber
2
Menarik bagaimana pertanyaan yang mudah dan sederhana ini memiliki jawaban yang terlalu berbeda dan rumit.
Sigur

Jawaban:

348

Dalam bash:

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

The 'dan 'sekitar ENDpembatas yang penting, jika tidak hal di dalam blok seperti misalnya $(command)akan diurai dan dijalankan.

Untuk penjelasan, lihat ini dan ini pertanyaan.

sunny256
sumber
24
Trik lucu - selama kata kunci 'AKHIR' (yang, tentu saja, yang dipilih pengguna) tidak muncul pada barisnya sendiri di dalam materi yang akan dikomentari.
Jonathan Leffler
9
@kalengi: Ya; kata yang digunakan dalam kutipan bisa menjadi sesuatu yang nyaman; EOFadalah contoh klasik (dan demikian juga !, tanda seru sendiri), tetapi Anda dapat menggunakan SNURFLE_BURGERSatau classical_end_markeratau kata lain yang tidak muncul pada baris sendiri di bahan komentar. Saya akan berani bereksperimen dengan spasi dll, tetapi kata itu mungkin bekerja dengan baik juga.
Jonathan Leffler
4
Ini pasti bekerja tetapi adakah yang bisa menjelaskan bagaimana ini bekerja? Terima kasih
mbbce
5
@ MB_CE, lihat stackoverflow.com/questions/32126653/… . Yang mengatakan - itu menjalankan perintah (: ) yang tidak membaca inputnya dan selalu keluar dengan nilai yang sukses, dan mengirimkan "komentar" sebagai input. Tidak banyak.
Charles Duffy
2
Saya menganggapnya sangat jelek dan membingungkan untuk menulis kode aktif untuk membuat kode pasif ... cukup gunakan mode pilih blok lama yang baik dan tekan #; apa masalah besar dengan itu?
Rusty75
90

Tidak ada blok komentar pada skrip shell.

Menggunakan vi(ya, vi) Anda dapat dengan mudah berkomentar dari baris n ke m

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

(yang berbunyi, dari baris 10 hingga 100 mulai baris pengganti (^) dengan tanda #.)

dan batalkan komentar dengan

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

(yang berbunyi, dari baris 10 hingga 100 mulai garis pengganti (^) diikuti oleh # dengan mencatat //.)

vihampir universal di mana pun ada /bin/sh.

OscarRyz
sumber
Trik yang bagus dengan ekspresi reguler pada vi ke posisi # di depan baris.
Atiq Rahman
5
Hanya tip - jika Anda menggunakan vim dan ini akhirnya menyoroti awal setiap baris, tambahkan |nohke akhir. Pipa memisahkan perintah tambahan dan nohuntuk nohighlight. Penandaan istilah pencarian akan secara otomatis dilanjutkan saat berikutnya Anda mencari sesuatu. Contoh::10,100s/^/#/g|noh
Matius
Saya ingin ini otomatis dari skrip. Apakah ada cara untuk melakukan itu pada file dengan vi tanpa perlu interaksi manusia?
Timothy Swan
1
@TimothySwan Saya membayangkan program gawk atau sed bisa melakukan itu ... entah bagaimana.
BeowulfNode42
cara mengomentari yang saya sukai (atau awalan) sebuah blok dengan vi: pergi ke awal baris yang ingin Anda mulai komentari (misalnya <SHIFT>+G 10 <ENTER>saat itu 0atau dengan cara lain untuk menavigasi). Kemudian gunakan <CTRL>+Vuntuk masuk ke mode blok visual dan sorot awal semua baris yang ingin Anda komentari (dalam contoh ini 90 J). Kemudian tekan SHIFT+Iuntuk menyisipkan sebelum blok yang disorot. Masukkan tanda komentar (mis. #) Dan tekan <ESC>untuk menyelesaikan awalan Anda. Penjelasan ini kedengarannya sangat panjang, tetapi dalam pengalaman saya itu jauh lebih cepat dalam praktek.
Ueffes
52

Kamu bisa memakai:

if [ 1 -eq 0 ]; then
  echo "The code that you want commented out goes here."
  echo "This echo statement will not be called."
fi
dannyhan12
sumber
14
Ini klasik, tetapi sebagai catatan stackoverflow.com/a/19409316/832230 , if [ ];juga berfungsi.
Acumenus
12
Mungkin lebih jelas: if false;. stackoverflow.com/a/18019516/2097284
Camille Goudeseune
3
Ini sepertinya hanya berfungsi karena teks yang dikomentari sebenarnya adalah kode. Saya mengalami masalah dengan komentar dengan pipa dan titik koma. Jawaban Sunny256 berhasil.
swdev
bahkan lebih ringkas akan []; menggunakan tes itu
Justin Duncan
27

Berikut harus bekerja untuk sh, bash, kshdanzsh .

Blok kode yang akan dikomentari dapat dimasukkan ke dalam BEGINCOMMENTdan 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"

Menjalankan kode di atas akan menghasilkan:

This is outside the commented block

Untuk membatalkan komentar , blok kode dengan demikian berkomentar

alias BEGINCOMMENT="if : ; then"

dari pada

alias BEGINCOMMENT="if [ ]; then"

dalam contoh di atas.

devnull
sumber
23

jika Anda dapat menghindari tanda kutip tunggal:

__='
blah blah comment.
'
vanvliet.eric
sumber
Saya suka ini. Apa artinya garis bawah ganda? Sejauh yang saya tahu itu hanya nama variabel menggunakan konvensi bahwa itu harus diperlakukan sebagai pribadi?
chessofnerd
Juga menyediakan penyorotan sintaks di sebagian besar editor dan dapat dipanggil jika diperlukan dengan $ __ meskipun saya akan menyarankan nama variabel seperti dokumentasi atau dokumen untuk kejelasan.
jasonleonhard
Anda juga dapat menambahkan kata lokal di depan ref di sini
jasonleonhard
Ini harus menjadi jawaban terbaik. Cukup masukkan beberapa nama variabel dummy alih-alih garis bawah ganda
B Abali
Sudah mencoba ini, tetapi gagal karena ada -F ';' di dalam blok untuk berkomentar.
yO_
15

Gunakan : 'untuk membuka dan 'menutup.

Sebagai contoh:

: '
This is a
very neat comment
in bash
'

Ini dari contoh Vegas yang ditemukan di sini

Relatif0
sumber
2
hack-ish, tapi mengagumkan
Gergely Lukacsy
itu yang terbaik untukku.
DPalharini
14

Di Vim:

  1. buka baris pertama blok yang ingin Anda komentari
  2. shift-V (masuk mode visual), ke atas sorot garis di blok
  3. jalankan berikut ini pada seleksi :s/^/#/
  4. perintahnya akan terlihat seperti ini:

      :'<,'>s/^/#
  5. tekan enter

misalnya

shift-V
jjj
:s/^/#
<enter>
Stefan
sumber
7
Untuk :s/^#/
membatalkan
Periksa jawaban @ horta: stackoverflow.com/a/28376319/3506015 - bahkan ada penekanan tombol yang lebih sedikit!
geedoubleya
4

Anda bisa menggunakan mode Blok Visual Vi / Vim yang dirancang untuk hal-hal seperti ini:

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

Uncomment akan menjadi:

Ctrl-V  
Highlight #'s  
d  
l  

Ini adalah cara interaktif vi dalam melakukan hal semacam ini daripada menghitung atau membaca nomor baris.

Terakhir, di Gvim Anda menggunakan ctrl-q untuk masuk ke mode Visual Block daripada ctrl-v (karena itu cara pintas untuk menempel).

horta
sumber
Suka metode sederhana ini. : o)
geedoubleya
4

Dalam semua kejujuran, mengapa terlalu banyak rekayasa ...

Saya menganggap itu benar-benar praktik buruk untuk menulis kode aktif untuk menghasilkan kode pasif.

Solusi saya: kebanyakan editor memiliki mode pilih blok. Cukup gunakan itu untuk menambahkan # ke semua baris yang ingin Anda komentari. Apa masalahnya...

Contoh notepad:

Untuk membuat: Alt - mousedrag ke bawah, tekan #.

Untuk menghapus: Alt-mousedrag ke bawah, geser ke kanan, hapus.

Rusty75
sumber
8
Pengguna kemungkinan besar berada di terminal. Tidak dapat mengasumsikan lingkungan mouse.
Gary
Apakah mereka masih ada? Saya biasanya mengedit dalam mode grafis dan menempel kembali menggunakan vi, itu akan menjadi solusi yang mudah.
Rusty75
2

Variasi pada trik di sini-doc dalam jawaban yang diterima oleh sunny256 adalah dengan menggunakan kata kunci Perl untuk komentar. Jika komentar Anda sebenarnya semacam dokumentasi, Anda kemudian dapat mulai menggunakan sintaks Perl di dalam blok komentar, yang memungkinkan Anda untuk mencetaknya dengan format yang bagus, mengonversinya menjadi halaman manual, dll.

Sejauh shell yang bersangkutan, Anda hanya perlu mengganti 'END'dengan '=cut'.

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

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

etc.

=cut
echo "after comment"

(Ditemukan di " Menanamkan dokumentasi dalam skrip shell ")

mivk
sumber
0

Mode lain adalah: Jika editor Anda TIDAK MEMILIKI opsi komentar,

  1. Buka instance kedua editor (misalnya File => File Baru ...)
  2. Dari file PREVIOUS yang sedang Anda kerjakan, pilih HANYA BAGIAN YANG ANDA INGINKAN KOMENTAR
  3. Salin dan tempel di jendela file sementara baru ...
  4. Buka menu Edit, pilih REPLACE dan masukan sebagai string yang akan diganti '\ n'
  5. masukan sebagai ganti string: '\ n #'
  6. tekan tombol 'ganti ALL'

DIBUAT

itu BEKERJA dengan editor APAPUN

mardocheo
sumber
0

Saya suka satu baris buka dan tutup:

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

'##' membantu saya dengan mudah menemukan awal dan akhir dari komentar blokir. Saya dapat menempel nomor setelah '##' jika saya punya banyak dari mereka. Untuk mematikan komentar, saya hanya menempelkan '1' di '[]'. Saya juga menghindari beberapa masalah yang saya alami dengan tanda kutip tunggal di blok komentar.

Ynnub
sumber