Arasındaki fark nedir grep apple file
ve 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).
Arasındaki fark nedir grep apple file
ve 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:
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ü apple
böyle bir karakter yoktur.
: Ama başka bir örneği ele grep apple tree file
sözcüğü arar apple
dosyalarında tree
ve file
oysa grep "apple tree" file
kelime arayacaktır apple tree
dosyada 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 file
aynı sonucu verir çünkü \
bash'a şu karakterin özel anlamını göz ardı etmesini ve tam anlamıyla davranmasını söyler.
"
) 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 USER
içeren (örneğin johnstacen
).
Ç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.
grep a*b equations.txt
arayacaktıra*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, genelliklefind . -name *.txt
dizinde 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.