Saya ingin melakukan sesuatu seperti bzr commit -m "It works!"
. Saya bisa lolos dari tanda seru dengan melakukan bzr commit -m "It works\!"
. Namun, kemudian pesan komit saya menyertakan backslash. Bagaimana saya bisa lolos dari tanda seru, sementara masih mengabaikan garis miring terbalik?
bash
syntax
escape-characters
Matius
sumber
sumber
bzr commit -m "It works"!
pekerjaan juga.bzr commit -m "It works!"
Jawaban:
Karena Anda tidak bergantung pada bash untuk memperluas variabel dalam pesan komit Anda, Anda bisa menggunakan tanda kutip tunggal. String dalam tanda kutip tunggal tidak diperluas oleh bash.
sumber
Berikut adalah metode lain jika Anda ingin tanda kutip ganda serta tanda seru:
Ini berfungsi bahkan jika
!
tidak di akhir baris.Misalnya:
Bonus: Teknik serupa dapat digunakan untuk menghindari teks apa pun di Sh atau Bash (dengan bantuan sed): lihat opsi pertama dalam jawaban ini . Selanjutnya, jika Anda telah
bash-completion
terinstal, Anda mungkin memiliki satuquote()
fungsi yang tersedia sudah.sumber
echo "Happy birthday!"
akan bekerja seperti yang diharapkan jika tidak, Anda dapat menghindarinya dengan backslash, tetapi backslash akan dicetak juga XD Bash bukan untuk yang lemah hati :)echo "Happy Birthday!"
menghasilkan 2 baris. Yang pertama adalahecho "Happy birthday"
(tidak ada seru), dan yang kedua adalah "Selamat ulang tahun" (sekali lagi, tidak ada seru). Apakah Anda memiliki ekspansi riwayat yang diaktifkan saat melakukan tes ini?version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
pasti hanya satu!
yang digunakan. Saya sudahhistexpand
hadir di$SHELLOPTS
. Namun, saya baru saja mencoba 4.3.18 (2) -tanggalkan pada komputer lain, dan berperilaku seperti yang Anda gambarkan. Saya kira itu adalah bug yang diperbaiki.Matikan ekspansi riwayat :
atau
Anda dapat menambahkan salah satu dari perintah itu ke Anda
~/.bashrc
jika Anda biasanya tidak menggunakan ekspansi riwayat.Bash 4.3 menambahkan kasus khusus :
sumber
set +o histexpand
, tidakset -o histexpand
. Bisakah Anda mengedit jawaban Anda untuk memperbaikinya?.bashrc
thx saya !!, tidak pernah digunakan!
dalam skrip dan untuk apa-apa !! itu selalu menyusahkan ...echo "@AquariusPower!"
Gunakan tanda kutip tunggal (') alih-alih tanda kutip ganda ("). Kutipan tunggal mematikan semua interpretasi barang di dalamnya, sedangkan tanda kutip ganda hanya mematikan sebagian.
sumber
Saya baru saja menemukan cara lain, yang paling tidak akan berfungsi dengan
echo
string (kalimat) yang ingin Anda beri tanda baca dengan tanda seru. Itu menjalankan akhir, lebih atau kurang, sekitar Bash histexpand dan hanya butuh sedikit lebih lama untuk kode.Hex untuk tanda seru, seperti yang tercantum di http://www.ascii-code.com/ , adalah 21, jadi jika Anda meletakkan
\x21
di akhir string Andaecho -e $foo
,, buat$foo
gema yang diperluas sendiri [yaitu,foo=$(echo -e "$foo")
], apa yang Anda dapatkan ketika Andaecho $foo
lagi adalah string dengan!
di akhir. Dan tidak ada switching histexpand baik.Bekerja pasti di Bash 4+. Versi sebelumnya, ymmv.
sumber
printf "OMG\041"
. Jika Anda membuat string yang dikutip ganda di suatu tempat yang bukan echo atau printf, seperti yang dilakukan oleh string komit OP, Anda dapat menanamkan$(echo -e "\041")
dalam string di mana tanda seru seharusnya. Seperti ini:bzr commit -m "This is a great commit$(echo -e "\041")"
.