Mempertimbangkan
echo \ # this is a comment
foo
Ini memberi:
$ sh foo.sh
# this is a comment
foo.sh: line 2: foo: command not found
Setelah beberapa pencarian di web, saya menemukan solusi oleh DigitalRoss di situs saudara Stack Overflow. Jadi orang bisa melakukannya
echo `: this is a comment` \
foo
atau sebagai alternatif
echo $(: this is a comment) \
foo
Namun, DigitalRoss tidak menjelaskan mengapa solusi ini bekerja. Saya menghargai penjelasan. Dia menjawab dengan komentar:
Dulu ada
goto
perintah shell yang bercabang ke label yang ditentukan seperti di:
sini. Thegoto
hilang tapi Anda masih dapat menggunakan: whatever
sintaks ...:
adalah semacam komentar parsing sekarang.
Tapi saya ingin lebih detail dan konteks, termasuk diskusi tentang portabilitas.
Tentu saja, jika ada yang punya solusi lain, itu akan bagus juga.
Lihat juga pertanyaan sebelumnya. Bagaimana mengomentari perintah multi-baris dalam skrip shell? .
Terima pesan dari diskusi di bawah ini. Itu `: this is a comment`
hanya pengganti perintah. Output dari : this is a comment
apa-apa, dan itu diletakkan di tempat `: this is a comment`
.
Pilihan yang lebih baik adalah sebagai berikut:
echo `# this is a comment` \
foo
make_FIND
skrip quickie yang membangun daftar panjang argumenfind
. Di sini, motivasi untuk membangun chunk by chunk adalah setiap chunk berasal dari tubuh loop, tetapi gaya yang sama memungkinkan untuk mengomentari setiap chunk.Anda dapat mencapai ini menggunakan array Bash, mis
Ini mendefinisikan sebuah array
$CMD
,, dan kemudian memperluasnya. Setelah diperluas, garis yang dihasilkan dievaluasi, sehingga dalam halecho foo
ini dieksekusi.Teks di antara
(
dan)
mendefinisikan array dan tunduk pada sintaks bash yang biasa, jadi semuanya pada baris setelahnya#
diabaikan.Perhatikan tentang mempertahankan spasi yang dikutip
${CMD[@]}
mengembang menjadi string tunggal yang merupakan gabungan dari semua elemen, dipisahkan oleh spasi. Setelah diperluas, Bash kemudian akan mengurai string menjadi token dengan cara biasa (cf $ IFS ), yang sering kali bukan yang kita inginkan.Sebaliknya jika ekspansi dibungkus dengan tanda kutip ganda, yaitu
"${CMD[@]}"
, maka setiap elemen dalam array dipertahankan. Pertimbangkan perbedaan antarahello world second item
dan"hello world" "second item"
.Contoh ilustrasi:
sumber
${CMD[@]}
tidak berkembang menjadi satu string. - Mengembang ke banyak string: Tidak hanya terpecah untuk setiap elemen array, tetapi juga pada spasi putih di setiap elemen. (Yaitu: sama sekali tidak berguna)Jangan lakukan
$(: comment)
. Itu bukan komentar - itu adalah subkulit - proses shell baru untuk sebagian besar shell. Tujuan Anda adalah untuk melakukan lebih sedikit dengan input Anda, tidak lebih, yang akan dilakukan - bahkan jika itu tidak ada gunanya.Anda bisa melakukannya ...
Pada dasarnya apa yang terjadi di sana adalah shell melakukan substitusi. Ini menggantikan nilai parameter shell khusus
$-
dua kali setiap kali. Bagaimanapun juga, ini adalah string pendek, tetapi selalu disetel - dan dengan demikian substitusi dalam - yang ditafsirkan sebagai pola untuk melepaskan dari luar - tidak memperluas ke konten di antara tanda kurung ketika saya menggunakan-
formulir ekspansi.Sini:
Lihat? Jadi itu hanya diperluas dua kali. Segera setelah shell menemukan parameter disetel semuanya di bidang ekspansi opsional dibuang, cukup banyak, dan itu mengembang ke seluruh nilainya yang dihapus dari dirinya sendiri dan tidak ada sama sekali. Dalam sebagian besar shell Anda bahkan tidak perlu melarikan diri dari kutipan, tetapi
bash
membutuhkannya.Lebih baik lagi adalah:
sumber