it-swarm.asia

Bash'de çift ve tek köşeli ayraçlar arasındaki fark nedir?

Sadece arasındaki farkın tam olarak ne olduğunu merak ettim

[[ $STRING != foo ]]

ve

[ $STRING != foo ]

bunun dışında, ikincisi posix uyumludur, sh'de bulunur ve ilki bash'da bulunan bir uzantıdır.

451
0x89

Birkaç fark var. Bence en önemlilerinden bazıları:

  1. [ Bash ve diğer birçok modern mermide yerleşiktir. Yerleşik [, ] Kapanış şartıyla test öğesine benzer. [ Ve test yerleşimleri, komut dosyalarının geriye dönük olarak uyumlu olması için /bin/[ Ve /bin/test İşlevlerini sınırlamaları ile birlikte taklit eder. Orijinal yürütülebilir dosyalar çoğunlukla POSIX uyumluluğu ve geriye dönük uyumluluk için mevcuttur. Bash'de type [ Komutunun çalıştırılması, [ Öğesinin varsayılan olarak yerleşik olarak yorumlandığını gösterir. (Not: which [ Yalnızca [~ # ~] yolundaki [~ # ~] yürütülebilir dosyaları arar ve type -p [)
  2. [[ Kadar uyumlu değil, /bin/sh Öğesinin işaret ettiği herhangi bir şeyle çalışması gerekmeyecek. Yani [[ Daha modern Bash/Zsh/Ksh seçenektir).
  3. [[ Kabuğun içine yerleştirildiğinden ve eski gereksinimleri olmadığından, [~ # ~] ifs [~ # ~] değişkeni boşluklu bir dizeyi değerlendiren değişkenleri karıştırır. Bu nedenle, değişkeni çift tırnak içine almanıza gerek yoktur.

Çoğunlukla, geri kalanı sadece güzel bir sözdizimidir. Daha fazla farklılık görmek için, bu bağlantıyı bir FAQ answer: Test arasındaki fark nedir [ve [[? ) öneririm. bash komut dosyası yazma hakkında SSS, Tuzaklar ve Kılavuz dahil olmak üzere tüm wiki , okumanızı öneririm. kılavuz bölümündeki test bölümü bunları açıklar farklılıklar ve yazarların neden taşınabilir olduğu konusunda endişelenmenize gerek yoksa [[ daha iyi bir seçim olduğunu düşünüyor.

  1. Bir değişken olarak okunması için testin sol tarafını alıntılamaktan endişelenmenize gerek yoktur.
  2. Giriş yeniden yönlendirmesi olarak değerlendirilmemeleri için < > 'Den daha az ve daha fazla kaçmak zorunda değilsiniz. Bu, dosyaların üzerine yazarak bazı şeyleri gerçekten karıştırabilir. Bu yine [[ Yerleşkesine dönüşüyor. [(Test) harici bir programsa, Shell < Ve > Değerlerini yalnızca /bin/test Çağrılırken bir istisna yapmalıdır. Gerçekten mantıklı değil.
325
Kyle Brandt

Kısacası:

[bir bashtır Yerleşik

[[]] bash Anahtar kelimelerdir

Anahtar kelimeler: Anahtar kelimeler yerleşik yapılara çok benzer, ancak temel fark, kendilerine özel ayrıştırma kurallarının uygulanmasıdır. Örneğin, [bir bash yerleşkesi iken [[bir bash anahtar kelimesidir. Her ikisi de bir şeyleri test etmek için kullanılır, ancak [[bir yerleşik kod yerine bir anahtar kelime olduğundan, çok daha kolay hale getiren birkaç özel ayrıştırma kuralından yararlanır:

  $ [ a < b ]
 -bash: b: No such file or directory
  $ [[ a < b ]]

İlk örnek bir hata döndürür, çünkü bash b dosyasını [a] komutuna yönlendirmeye çalışır. İkinci örnek aslında beklediğiniz şeyi yapar. <Karakteri artık Dosya Yeniden Yönlendirme işlecinin özel anlamına sahip değil.

Kaynak: http://mywiki.wooledge.org/BashGuide/CommandsAndArguments

138
abhiomkar

Tek Köşeli Parantez yani [], bir koşullu ifadeyi kapsamak için POSIX Kabuğu ile uyumludur.

Çift Parantez yani [[]], standart POSIX sürümünün geliştirilmiş (veya uzantı) bir sürümüdür, bu bash ve diğer kabuklar (zsh, ksh) tarafından desteklenir.

Bash'da, sayısal karşılaştırma için eq, ne, lt ve gt, karşılaştırma için çift parantez ile ==, !=, <, ve > kelimenin tam anlamıyla.

  • [, test komutunun eşanlamlısıdır. Kabukta yerleşik olsa bile, yeni bir süreç yaratır.
  • [[ yeni bir geliştirilmiş sürümüdür, bu bir program değildir, bir anahtar kelimedir.

örneğin:

[ var1 lt var2] #works
[ var1 < var2] #error: var2 No such file or directory 
[ var1 \< var2] #works with escape
[[ var1 < var2]] #works
6
Premraj

Man sayfanın ilgili bölümlerinin hızlı bir şekilde okunmasına dayanarak, birincil fark == ve != operatörleri değişmez bir dize yerine bir desene karşılık gelir ve ayrıca =~ normal ifade karşılaştırma operatörü.

4
womble