Grep apple dosyası ile grep “apple” dosyası arasındaki fark nedir?


22

Arasındaki fark nedir grep apple fileve grep "apple" file? Tırnak işareti koymak ne işe yarar? Her ikisi de çalışır ve aynı şeyi yaparlar (aynı satırı görüntüler).

Yanıtlar:


45

Tırnak işaretlerinin, kabuğunuzun hangi karakterleri özel gördüğü ve sözdizimsel bir anlamı olduğu üzerinde etkisi vardır. Örneğinizde bu fark yaratmaz çünkü appleböyle bir karakter yoktur.

: Ama başka bir örneği ele grep apple tree filesözcüğü arar appledosyalarında treeve fileoysa grep "apple tree" filekelime arayacaktır apple treedosyada file. Tırnak işaretleri bash'a söyler ki, içindeki boşluk kelimesi "apple tree"yeni bir parametre başlatmaz, fakat mevcut parametrenin bir parçası olur. grep apple\ tree fileaynı sonucu verir çünkü \bash'a şu karakterin özel anlamını göz ardı etmesini ve tam anlamıyla davranmasını söyler.


2
Bu, joker karakterlerle de görülebilir. Bunu yaparsanız , geçerli dizinde a ile başlayan ve b ile biten bir dosya olmadığı sürece grep a*b equations.txtarayacaktır a*b, (bu durumda (ba) sh komut satırında dosya isimlerini genişletecektir) grep ile çağrılacak farklı sonuçlarla sonuçlanan farklı parametreleri tamamlayın. Bu genellikle, genellikle find . -name *.txtdizinde bir txt dosyası varsa, beklenmeyen bir davranışla sonuçlanacak bir komut olarak bulunan, bul ile ilgili bir sorundur . Bu durumda tırnak kullanmak daha iyidir.
SztupY

4
Bir başka önemli nokta, çift tırnak ( ") ve tek tırnak ( ') arasındaki farktır . Tek tırnak, bazı $çiftlerin yorumlanmasına izin verirken bazı karakterlerin yorumlanmasını önler . Örneğin grep '${USER}'metin arayacaktır ${USER}oysa, grep "${USER}"değişken metin için bakacağız USERiçeren (örneğin johnstacen).
Paddy Landau

23

Çift tırnak, değerlendirmeye izin verir, tek tırnak, değerlendirmeyi engeller, hiçbir komut, komut satırında kullanıldığında joker karakter genişlemesine izin vermez. Tartışılan örnekler olarak:

[user@work test]$ ls .
A.txt B.txt C.txt D.cpp

# The following is the same as writing echo 'A.txt B.txt C.txt D.cpp'
[user@work test]$ echo *
A.txt B.txt C.txt D.cpp

[user@work test]$ echo "*"
*

[user@work test]$ echo '*'
*

# The following is the same as writing echo 'A.txt B.txt C.txt'
[user@work test]$ echo *.txt
A.txt B.txt C.txt

[user@work test]$ echo "*.txt"
*.txt

[user@work test]$ echo '*.txt'
*.txt

[user@work test]$ myname=is Fred; echo $myname
bash: Fred: command not found

[user@work test]$ myname=is\ Fred; echo $myname
is Fred

[user@work test]$ myname="is Fred"; echo $myname
is Fred

[user@work test]$ myname='is Fred'; echo $myname
is Fred

Alıntıların çalışma şeklini anlamak Bash'i anlamak için çok önemlidir. Örneğin:

# for will operate on each file name separately (like an array), looping 3 times.
[user@work test]$ for f in $(echo *txt); do echo "$f"; done;
A.txt
B.txt
C.txt

# for will see only the string, 'A.txt B.txt C.txt' and loop just once.
[user@work test]$ for f in "$(echo *txt)"; do echo "$f"; done;
A.txt B.txt C.txt

# this just returns the string - it can't be evaluated in single quotes.
[user@work test]$ for f in '$(echo *txt)'; do echo "$f"; done;
$(echo *txt)

Bir değişkeni kullanarak bir komutu iletmek için tek tırnakları kullanabilirsiniz. Tek tırnak, değerlendirmeyi engelleyecektir. İkili tırnaklar değerlendirilecektir.

# This returns three distinct elements, like an array.
[user@work test]$ echo='echo *.txt'; echo $($echo)
A.txt B.txt C.txt

# This returns what looks like three elements, but it is actually a single string.
[user@work test]$ echo='echo *.txt'; echo "$($echo)"
A.txt B.txt C.txt

# This cannot be evaluated, so it returns whatever is between quotes, literally.
[user@work test]$ echo='echo *.txt'; echo '$($echo)'
$($echo)

Çift tırnak içinde tek tırnak kullanabilirsiniz ve çift tırnak içinde çift tırnak kullanabilirsiniz, ancak tek tırnak içinde çift tırnak kullanılmamalıdır (onlardan kaçmadan) değerlendirilmeyecektir, tam anlamıyla yorumlanacaktır. Tekil alıntılar içindeki tekil alıntılar (onlardan kaçmadan) yapılmamalıdır.

Bash'i etkili bir şekilde kullanmak için kapsamlı bir tırnak anlayışı edinmeniz gerekir. Çok önemli!

Genel bir kural olarak eğer Bash'in bir şeyi elemanlara genişletmesini istersem (dizi gibi) tırnak işaretleri kullanmıyorum, değişmeyen metinler için tek tırnak işaretleri kullanıyorum ve değişkenler için çift tırnak işaretini liberal olarak kullanıyorum Herhangi bir dize döndürmek olasıdır. Bu, boşlukların ve özel karakterlerin korunmasını sağlamak içindir.


Çift tırnak içinde çift tırnak nasıl kullanılır? Bu bir yazım hatası mı? Ve neden tek tırnak içinde çift tırnaktan kaçmalıyım? Sanırım cümleleri karıştırdın belki de?
Byte Komutanı

@ByteCommander Evet, çift tırnak işareti içine yerleştirilmiş çift tırnak işareti kavramı oldukça yaygın olarak kullanılır - belirgin bir çalışma örneği için bu yazıya bakın . Genellikle boşluk içeren dizeleri, genellikle yol dizelerine göre korumak için yapılır. İkili tırnaklar, tırnaklı veya tırnaklı olmayan tek tırnaklar içinde kullanılabilir, ancak bunlar gerçek anlamda yorumlanır, yani değerlendirmeye yol açmazlar. Yazıdaki bu noktayı açıklayacağım.
AsymLabs
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.