2010-08-07 4 views
7

Çeşitli kılavuzlarda ve komut dosyalarında rastladığım zaman insanlar ifadelerin farklı sözdizimini kullanma eğilimindedir. Fark nedir ve en iyi uygulama nedir? Aşağıdaki tüm ifadelerin ve daha birçok varyantın true olacağına inanıyorum:bash/sh ifrax sözdizimi

bar="foo" 
if [ "foo" = "foo" ] 
if [[ "foo" == $bar ]] 
if [ "foo" = "$bar" ] 
if [[ "foo" = "$bar" ]] 
if [[ "foo" -eq $bar ]] 
+1

[bash: çift veya tek parantez, parantez, kaşlı ayraçlar] olası kopyası (http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces) –

+0

http://mywiki.wooledge.org/BashGuide http://mywiki.wooledge.org/BashFAQ http://mywiki.wooledge.org/BashPitfalls – Philipp

cevap

5
ben yani z * genişleyebilir, bu

= dizeleri

-eq tamsayılar

"$ çubuğu" literal maçları içindir bekliyor beklediğini anlamak gibi

ancak "z *" anlamıyla eşleşir joker karakter

[] ve [[]] arasındaki fark, ikinci sözcük bölme ve yol adı genişletme işleminin yapılmadığı, ancak eski sürümde yer almasıdır.

artı [[]] ek operatörleri sağlar:

& & (VE), || (OR) > (String1 Dize2 daha lexically daha yüksek), < (String1 Dize2 daha lexically az)

== Karşılaştırma operatörü tek parantez içinde yerine çift-parantez test içinde farklı davranır.

[[$ a == z *]] # $ a öğesi bir "z" ile başlıyorsa (desen eşleştirmesi) true.

[[$ a == "z *"]] # $ a, z * öğesine eşitse (tam eşleme).

[$ a == z *] # Dosya sallanma ve kelime bölme işlemi gerçekleşir.

["$ a" == "z *"] # $ a, z * öğesine eşitse (tam eşleme).

Kontrol dışarı http://tldp.org/LDP/abs/html/comparison-ops.html fazla bilgi için

+0

Küçük düzeltme/açıklama: '=' ve '==' tam olarak Aynı şey (yani her ikisi de [[]] 'nin içinde eşleştirme yaparlar. Temel olarak, '==' kullanmanın tek nedeni, diğer dillerden tanıdığıdır. Ayrıca, '' '<' and '>' ile dize karşılaştırmasını destekliyor, sadece bunları kaçmak zorundasınız ya da örneğin G/Ç yönlendirmeleri olarak ayrıştırılacaklar: '[string1 \

2

I case/esac öneririm.

Farklı sözdizimi hakkında endişe yok.

3

[[[ bir bash anahtar kelimedir, bir bash yerleşiğidir. En iyi uygulama, betiğin diğer kabuklarla uyumlu olması gerekmediğinde (örneğin #!/bin/bash ile başlıyorsa) [['u kullanmak ve ['u yalnızca Bourne kabuğuna uyumluluk için kullanmaktır. Bakınız http://mywiki.wooledge.org/BashFAQ/031.