Ne zaman tek tırnak, çift tırnak grep içinde kullanılır?


20

Bir dosyada basit bir desen "merhaba" aramaya çalışırken, aşağıdaki grep formlarının tümü çalışır:

  • grep merhaba dosya1
  • grep 'merhaba' dosya1
  • grep "merhaba" dosya1

Yukarıdaki formlardan birinin çalıştığı ancak diğerlerinin çalışmadığı belirli bir durum var mı? Birini diğerinin yerine kullanırsam herhangi bir fark yaratır mı?

Yanıtlar:


25

Bu aslında kabuğunuza bağlıdır. Tırnak işaretleri (her iki tür) öncelikle boşlukla ilgilenmek içindir. Örneğin, aşağıdakiler:

grep hello world file1

"world" ve "file1" adlı dosyalarda "merhaba" kelimesini arayacak,

grep "hello world" file1

dosya1 "merhaba dünya" arayacaktır.

Tek veya çift tırnak işaretleri arasındaki seçim, yalnızca arama dizesi, değerlendirilmesini beklediğiniz değişkenler veya başka öğeler içeriyorsa önemlidir. Tek tırnak içinde, dize tam anlamıyla alınır ve genişleme gerçekleşmez. Çift tırnak işareti ile değişkenler genişletilir. Örneğin (Bash veya ZSH gibi Bourne'den türetilmiş bir kabukla):

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

Birincisi grep, dosya1'deki "$ VAR1" değişmez dizgisini arayacaktır. İkincisi "$ VAR" değişkenini genişletecek ve dosya1'de "serverfault" dizesini arayacaktır.


Dikkat edilmesi gereken en önemli şey, orijinal soruda, grep'in aslında her seferinde aynı argümanları almasıdır.
MikeyB

2
Orada dikkatli ol. $düzenli bir ifadede satır sonu olduğundan $VAR1, hiçbir şeyle eşleşmemelidir. GNU grep üzerinde çalışıyor, ama yine de bu davranışa güvenmem. \$VAR1Değişmez dizeyle güvenli bir şekilde eşleşmeniz gerekir . (Ve eğer çift tırnak işaretleri varsa ekstra ters eğik çizgi gerekir.)
Steven Pritchard

7

James doğrudur, ancak daha fazla veri eklemek için, bunu düşünmenin en iyi yolunun komuta argümanlar olduğunu düşünüyorum: "merhaba" ve "dünya" nın iki argüman olmasını mı yoksa "merhaba dünya" nın tek olmasını mı istiyorsunuz? argüman.

Ayrıca, çift tırnak sadece değişkenlerden daha fazlasının yorumlanmasına izin verir. Tam olarak kabuğunuza bağlı olan, ancak geçmiş genişletme, küme genişletme ve dosya adı genişletme kontrol edin.

Her iki tırnak türünü de tek bir argümanda kullanmanız gereken bazı durumlar olduğunu belirtmek de önemlidir. (Varsayılan olarak) bağımsız değişkenlerin boşlukla sınırlandığını unutmayın, bu nedenle boşluk bırakmazsanız aynı argümanı yine de belirtirsiniz.

Çoğu merminin tek tırnak mekanizması özel karakterlere izin vermez, yani başka bir tek tırnak örneğinin kaçmış gibi görünse bile alıntı sona erer. Bu nedenle, tek tırnaklı bir dizeyi tek tırnaklı bir dizenin içine geçirmek imkansızdır ve çift tırnak kullanmanız gerekir. Tek tırnak içeren ve yorumlanacak bir şey içeren bir argüman iletmek istediğinizde bu bir acı olabilir, ama olmak istemezsiniz. Örneğin, "" $ VAR "bir değişkendir" değişmez dizesini iletmek istiyorsanız, bunu şu şekilde yapmanız gerekir:

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

Bu aslında alıntıdan kaçan üç dizenin birleşimidir:

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

veya tırnak işaretleri kaldırıldığında:

'
$VAR
' is a variable

Aslında, çoğu kabukla, bunu şu şekilde de yapabilirsiniz:

"'\$VAR' is a variable"

burada ters eğik çizgi (" \") kabuğa aşağıdaki karakteri tam anlamıyla kabul etmesini ve üzerinde herhangi bir genişleme yapmamasını söyler.

Ancak, bunu çok dize birleştirme yolu yapmak zorunda kaldığınız bazı durumlar vardır, aslında şu anda bir örnek oluşturabileceğimden değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.