E. g. Saya ingin mengatakan
perl -e 'print '"'"'Hello, world!'"'"', "\n";'
Apakah ada cara yang kurang canggung untuk melakukannya, misalnya melarikan diri dari tanda kutip tunggal?
Ya, saya tahu saya bisa menulis
perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'
Tetapi pertanyaan ini adalah tentang mengutip di shell, bukan di Perl.
Saya tertarik bagaimana melakukannya bash
dan csh
sejak awal.
sumber
blah <<\EOF … EOF
. ) . Anda juga dapat menggunakan<<'EOF'
dan<<"EOF
. Mereka semua secara harfiah berarti dokumen di sini (tidak seperti Perl). Jika Anda benar-benar bertekad, Anda bisa melakukannyablah "$(cat<<\EOF … EOF )" other args
(menggunakan baris baru di mana saya telah menulis spasi di substitusi perintah; ksh dan zsh dapat melakukannya tanpa kucing , yang lain membutuhkannya). Tetapi apakah itu benar-benar layak?echo '\U0000068\U000069'
gema 'hai'. Tidak yakin mengapa meskipun kecuali itu adalah bug di shell.\U
dalam kasus itu sedang dilakukan oleh perintah gema-E
bawaan (perilaku ini dapat dikontrol oleh atau opsi BSD_ECHO dan-e
). Anda dapat melihat bahwa string literal dilewatkan (dan tidak diartikan sebaliknya) dalam perintah lain; misprintf %s\\n '\U0000068\U000069'
.Bagi saya, semua contoh Anda menghasilkan:
Demikian juga ini:
Dan ini:
Bisakah Anda mengklarifikasi apa yang Anda coba lakukan?
Dalam shell, seperti Bash, jika Anda ingin mencetak tanda kutip sebagai bagian dari string, satu jenis kutipan lolos dari yang lain.
Edit:
Inilah cara lain:
Ruang setelah titik seru menghindari kesalahan ekspansi riwayat. Saya bisa melakukannya
set +H
sebagai gantinya.sumber
Tidak yakin apakah edit saya ke jawaban sebelumnya akan muncul:
Menempelkan yang sama dengan jawaban baru:
Pendekatan alternatif:
Ketika saya mencoba solusi Anda saya masih tidak bisa mendapatkan 'dicetak.
Tetapi saya mengambil petunjuk dari solusi Anda dan mencoba yang berikut:
Nilai ASCII dari 'adalah 39.
Saya membutuhkan ini untuk membuat inline edit ke banyak file untuk ditambahkan 'di lokasi yang menarik.
sumber
Di sini, dokumen adalah cara terbaik untuk tidak peduli untuk melarikan diri:
Anda dapat benar-benar menggagalkan semua ekspansi dengan menggunakan dokumen yang dikutip di sini:
Jika Anda ingin meneruskannya sebagai argumen alih-alih input, Anda dapat menggunakan xargs:
sumber
Saya tidak tahu apakah ada opsi untuk melakukan ini di bash, tetapi dengan zsh Anda dapat menggunakan
''
setelah mengaktifkanRC_QUOTES
opsi. (Saya akan merekomendasikan mencoba zsh; kebanyakan bash-kompatibel dan dapat meniru bash untuk kompatibilitas yang lebih banyak lagi.)Dengan bash (dan masih sebagian besar waktu dengan zsh), saya hanya menggunakan
'\''
karena lebih mudah dibaca daripada'"'"'
.Saya sama sekali tidak tahu bagaimana melakukannya di csh.
sumber
Anda dapat menggunakan \ 'dan \ "untuk menghindari tanda kutip dengan perl jika digunakan secara internal sebagai bagian dari skrip perl. Saya tidak yakin apakah baris perintah akan menerimanya. Anda dapat mencobanya dan melihat apakah itu berfungsi.
sumber