2010-08-07 13 views
7

W różnych przewodnikach i skryptach, z którymi się spotykam, mają tendencję do używania innej składni instrukcji if. Jaka jest różnica i jakie są najlepsze praktyki? Uważam, że wszystkie poniższe stwierdzenia i wiele innych wariantów zostanie zwrócony:bash/sh, jeśli składnia instrukcji

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

możliwe duplikat [bash podwójne lub pojedyncze wspornika, nawiasach nawiasów klamrowych] (http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces) –

+0

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

Odpowiedz

5

jak rozumiem

= spodziewa ciągi

eq oczekuje całkowitymi

"$ bar" jest dosłownym meczów, czyli z * może poszerzyć ale "z *" dosłownie dopasować wildcard char.

Różnica między [] i [[]] polega na tym, że w drugim wyrazie podział i rozszerzenie nazwy ścieżki nie są wykonywane, ale są w pierwszym.

Plus [[]] pozwala na dodatkowe operatory:

& & (I), || (OR) > (String1 lexically większa niż ciąg2) < (String1 lexically poniżej ciąg2)

operatora porównania == zachowuje się inaczej w teście podwójnego wsporniki niż na pojedynczych wsporników.

[[$ a == z *]] # Prawda, jeśli $ a rozpoczyna się od "z" (dopasowanie do wzorca).

[[$ a == "z *"]] # Prawda, jeśli $ a jest równe z * (dopasowanie literalne).

[$ a == z *] # Rozpowszechnianie plików i dzielenie słów.

["$ a" == "z *"] # Prawda, jeśli $ a jest równe z * (dopasowanie literalne).

Wyjazd http://tldp.org/LDP/abs/html/comparison-ops.html uzyskać więcej informacji

+0

Niewielka korekta/wyjaśnienie: '=' i '==' wykonaj dokładnie to samo (tj. obaj robią dopasowywanie wzorców wewnątrz '[[]]'), z tym wyjątkiem, że niektóre implementacje '[' nie obsługują '=='. Zasadniczo jedynym powodem używania '==' jest to, że jest znany z innych języków. Ponadto '[' obsługuje porównania łańcuchów z '<' and '>', musisz po prostu uciec od nich lub będą one przetwarzane jako przekierowania we/wy: '[string1 \

2

Polecam case/esac.

case "$foo" in 
    "bar") echo "bar";; 
    *) echo "not equal";; 
esac 

Bez obaw o różną składnię.

3

[ jest wbudowane bash, [[ jest kluczowe bash. Najlepszą praktyką jest zawsze używać [[, jeśli skrypt nie musi być zgodny z innymi powłokami (np. Jeśli zaczyna się od #!/bin/bash) i używać tylko [ w celu zapewnienia zgodności z powłoką Bourne'a. Zobacz http://mywiki.wooledge.org/BashFAQ/031.

Powiązane problemy