Operatory porównania i wyrażenia Bash

11

Jestem nowy w programowaniu bash. Przeczytałem dwa dobre, długie przewodniki, ale zrobiły mi bałagan na temat operatorów i słów kluczowych.

Które są powszechnie i szeroko stosowane? Nie wiem, kiedy użyć, i dlaczego.

  1. test, [[ ]]Lub [ ]nawet(( ))
  2. $((exp)) lub $[exp]
  3. -gtlub >, gelub >=etc.
  4. kiedy używać <i / >lub ( )kiedy musimy przed tym uciec \: \< \(itp.
  5. ==lub =(porównania ciągów)

Znam podstawowe różnice między [a [[jednak inne kwestie są dla mnie tajemnicą.

Z góry dziękuję

MikeD
źródło
2
Bardzo przydatną wiki, która jest aktualna i wspomina wiele dobrych praktyk, jest wiki Grega . Przewodnik Bash i najczęściej zadawane pytania na jego temat są szczególnie przydatne.

Odpowiedzi:

5
  • testjest wbudowaną powłoką, która (oczywiście) testuje w określonych warunkach. Niektóre starsze powłoki wymagają specjalnego polecenia. Więc znajdziesz również program na /usr/bin/test.
  • [to także program do testowania niektórych warunków. To oprogramowanie wymaga również klamry zamykającej i można je znaleźć pod adresem /usr/bin/[.
  • [[…]]jest alternatywą dla testi [. Został opracowany dla powłoki Korn ( ksh). Ale znajdziesz go również w wersjach Bash większych niż 2 oraz w Z Shell. Podwójne nawiasy mają kilka ciekawych cech:
    • Powłoka nie rozdziela słów ani nie rozszerza nazw plików.
    • Nie potrzebujesz cytowania.
    • Zamiast -a(AND) lub -o(OR) możesz użyć &&lub ||.
    • =Można zrobić dużo więcej.
  • ((…))jest równoważne z let. Zasadniczo ((expression))jest taki sam jak let "expression". Jednak ze letmożna użyć więcej niż jeden wyraz, ale podwójne szelki umożliwiają tylko jeden wyraz.
  • $((…))(a także $[…]) wykonuje pewne obliczenia. Powłoka próbuje obliczyć wyrażenie w nawiasach klamrowych i zastępuje je wynikiem. Więc echo $((1+1))prowadzi do echo 2. Więc twoje muszle wypisują liczbę 2.

Za każdym razem, gdy chcemy porównać dwie liczby należy użyć opcji z myślnikiem i dwóch liter ( -ge, -ltetc.). Jeśli chcesz porównać ciągi, powinieneś użyć =lub !=.

Na twoje pytanie dotyczące ucieczki trudno jest odpowiedzieć. Ponieważ zależy to od oprogramowania, którego używasz oprócz powłoki. Więc to jest grepi grep -Etrzeba inną ucieczkę. Jest to również miejsce w przypadku sed, awki inni. Najlepszą opcją jest spojrzenie na stronę podręcznika. Po pewnym czasie przyzwyczajasz się i wiesz, kiedy użyć ucieczki.

qbi
źródło
Dziękuję Ci. jeszcze jedno pytanie - ponieważ możliwe jest porównanie za pomocą ((...)) - czy częściej używa się tej wersji: if ((2> 1)) LUB to: if [[2 -gt 1]]
MikeD
Zakładam, że if [ 2 -gt 1 ]; …jest to bardziej powszechne, ponieważ widzę to częściej w skryptach powłoki i, o ile wiem, jest to zgodne z POSIX.
qbi
Inną rzeczą, o której należy pamiętać, jest to, że [wyrażenie] jest prawdziwe, jeśli wyrażenie zwraca wartość / zwraca zero, ale ((wyrażenie)) jest prawdziwe, jeśli wyrażenie zwraca wartość / zwraca wartość niezerową.
Joe