Kapan menggunakan single-quote, double-quote di grep?

20

Saat mencoba mencari pola "halo" sederhana dalam file, semua bentuk kerja grep berikut:

  • grep halo file1
  • grep 'hello' file1
  • grep "halo" file1

Apakah ada kasus khusus di mana salah satu dari bentuk di atas bekerja tetapi yang lain tidak. Apakah ada bedanya jika saya menggunakan satu di tempat yang lain?


sumber

Jawaban:

25

Ini sebenarnya tergantung pada shell Anda. Kutipan (jenis apa pun) utamanya dimaksudkan untuk menangani spasi putih. Misalnya, berikut ini:

grep hello world file1

akan mencari kata "halo" di file yang disebut "dunia" dan "file1", sementara

grep "hello world" file1

akan mencari "hello world" di file1.

Pilihan antara tanda kutip tunggal atau ganda hanya penting jika string pencarian berisi variabel atau item lain yang Anda harapkan akan dievaluasi. Dengan tanda kutip tunggal, string diambil secara harfiah dan tidak ada ekspansi yang terjadi. Dengan tanda kutip ganda, variabel diperluas. Misalnya (dengan shell yang diturunkan dari Bourne seperti Bash atau ZSH):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

Yang pertama grepakan mencari string literal "$ VAR1" di file1. Yang kedua akan memperluas variabel "$ VAR" dan mencari string "serverfault" di file1.

James Sneeringer
sumber
Hal utama yang perlu diperhatikan adalah bahwa dalam pertanyaan awal, grep sebenarnya menerima argumen yang persis sama setiap saat.
MikeyB
2
Hati-hati disana. $adalah end-of-line dalam ekspresi reguler, jadi $VAR1seharusnya tidak pernah benar-benar cocok dengan apa pun. Itu kebetulan bekerja pada GNU grep, tapi saya masih tidak akan mengandalkan perilaku itu. Anda harus \$VAR1mencocokkan string literal dengan aman. (Dan Anda perlu garis miring terbalik ekstra jika itu dalam tanda kutip ganda.)
Steven Pritchard
7

James benar, tetapi untuk menambahkan lebih banyak data, saya pikir cara terbaik untuk memikirkannya adalah sebagai argumen pada perintah: apakah Anda bermaksud "halo" dan "dunia" menjadi dua argumen atau "halo dunia" menjadi satu argumen.

Juga, tanda kutip ganda memungkinkan interpretasi lebih dari sekadar variabel. Tepatnya apa yang tergantung pada shell Anda, tetapi periksa ekspansi sejarah, ekspansi brace, dan ekspansi nama file.

Penting juga untuk dicatat bahwa ada beberapa contoh di mana Anda perlu menggunakan kedua jenis kutipan dalam satu argumen. Ingatlah bahwa (secara default) argumen dibatasi oleh spasi, jadi jika Anda tidak meninggalkan ruang, Anda masih menentukan argumen yang sama.

Mekanisme singlequote Kebanyakan shell tidak memungkinkan untuk karakter khusus, yang berarti bahwa setiap instance dari singlequote lain, bahkan jika itu tampaknya lolos, mengakhiri kutipan. Oleh karena itu tidak mungkin untuk melewatkan string dengan tanda kutip tunggal di dalam string tanda kutip tunggal, dan Anda harus menggunakan tanda kutip ganda. Ini bisa menyebalkan ketika Anda ingin menyampaikan argumen yang berisi singlequote dan sesuatu yang akan ditafsirkan, tetapi Anda tidak mau. Misalnya, jika Anda ingin meneruskan string literal "` '$ VAR' adalah variabel ", Anda harus melakukannya dengan cara ini:

"'"'$VAR'"' is a variable"

Itu sebenarnya adalah gabungan dari tiga string kutipan-lolos:

"'"
'$VAR'
"' is a variable"

atau, dengan kutipan dihapus:

'
$VAR
' is a variable

Sebenarnya, dengan sebagian besar kerang, Anda juga bisa melakukannya dengan cara ini:

"'\$VAR' is a variable"

di mana backslash (" \") memberi tahu shell untuk menerima karakter berikut secara harfiah dan tidak melakukan ekspansi apa pun di atasnya.

Tetapi ada beberapa contoh di mana Anda akhirnya harus melakukannya dengan cara multi-string-concatenation, bukan berarti saya benar-benar dapat memberikan contoh sekarang.

wfaulk
sumber