Saya telah menulis sendiri program linux program
yang membutuhkan ekspresi reguler sebagai input.
Saya ingin memanggil program di bash
shell dan meneruskan ekspresi reguler sebagai argumen baris perintah ke program (ada juga argumen baris perintah lainnya). Seperti biasa, ekspresi reguler
[abc]\_[x|y]
Sayangnya karakter [
, ]
dan |
karakter khusus di bash
. Demikian panggilan
program [abc]\_[x|y] anotheragument
tidak bekerja Apakah ada cara untuk melewatkan ekspresi dengan menggunakan semacam karakter pelarian atau tanda kutip dll?
(Memanggil program "[abc]\_[x|y] anotheragument"
tidak berfungsi juga, karena menafsirkan kedua argumen sebagai satu.)
sumber
"$HOME"
atau parameter yang berkembang"${USER:-root}"
, substitusi perintah dalam bentuk apa pun ,"$(date)"
atau"`date`"
ekspansi aritmatika"$((1 + 2))"
, ekspansi sejarah,"!!"
atau pelarian backslash"\\"
. Gunakan tanda kutip tunggal sebagai gantinya. Lihat halaman manual manual bash, bagian berjudul "Mengutip".Gunakan tanda kutip tunggal. Kutipan tunggal memastikan bahwa tidak ada karakter yang ditafsirkan.
Ada dua solusi jika Anda perlu menyematkan satu kutipan:
sumber
Per
man bash
sumber
Anda dapat menggunakan garis miring terbalik (
\
) di depan karakter khusus untuk menghindarinya seperti:sumber
Meskipun mungkin tidak berguna sebagai regex, beberapa urutan karakter dapat ditafsirkan sebagai nama variabel Bash. Untuk mencegah hal ini terjadi dan menghindarinya, gunakan tanda kutip tunggal alih-alih tanda kutip ganda:
Kutip setiap argumen secara terpisah (jika mereka perlu mengutip) sehingga mereka ditafsirkan sebagai argumen independen. Anda juga dapat menggunakan array dalam beberapa kasus:
sumber
sumber
Melarikan diri dari mereka harus bekerja dengan baik:
sumber
Dari mana pola itu berasal? Apakah sudah diperbaiki atau dari pengguna? Apakah pengguna yang menggunakan skrip pada sistem lokal, atau seseorang yang jauh?
Anda menggunakan kutipan untuk membungkus data agar shell tidak menafsirkannya. Ada dua opsi:
Karena
$
karakter yang valid di regexps (end-of-line / buffer) Anda mungkin ingin menggunakan tanda kutip tunggal untuk menahan regexp, kecuali Anda menyimpannya dalam variabel. Jika Anda mengambil data sewenang-wenang dari seseorang yang tidak dipercaya, Anda harus menggantinya'
dengan'"'"'
dan kemudian membungkusnya dengan tanda kutip tunggal.Catatan yang
[abc]_[x|y]
sepertinya Anda ingin cocokkanx
atauy
, sementara itu sebenarnya cocok dengan salah satu dari tiga karakterxy|
. Kurung kotak cocok dengan karakter di dalam dan hanya-
untuk rentang dan^
di awal untuk negasi. Jadi,[abc]_(x|y)
mungkin itu yang Anda maksud, dan tanda kurung adalah karakter yang khusus untuk shell. Kurung kotak tidak khusus untuk di-shell, sepertinya begitu. Tanda kurung ganda[[ ... ]]
adalah spesial.sumber
'
dengan'"'"'
), namun, masih tidak benar.[
ADALAH karakter khusus untuk shell, digunakan dalam wildcard ketika melakukan path-expansion (shell tidak untuk semua tanda kutip).foo=a[b]
dan kemudianecho $foo
dan melihat bahwa string tidak perlu mengutip. Anda benar, saya terlalu singkat.ab
di direktori saat ini, dan kemudianfoo
akan berisiab
daripadaa[b]
. Kutip kurung kotak Anda, orang-orang.setopt glob_assign
mengaktifkan perilaku ini juga, jadi mengutip adalah jawaban yang paling aman.