Operadores de comparação e expressão de bash

11

Eu sou novo em bash programação. Eu li dois bons e longos guias, mas eles fizeram uma bagunça na minha cabeça sobre operadores e palavras-chave.

Quais são mais comum e amplamente utilizados? Não sei quando usar qual e por quê.

  1. test, [[ ]]Ou [ ]ou mesmo(( ))
  2. $((exp)) ou $[exp]
  3. -gtou >, geou >=etc.
  4. quando usar <e >ou ( )quando temos que escapar com \: \< \(etc.
  5. ==ou =(comparações de string)

Eu sei que as diferenças básicas entre [e [[outras questões são um mistério para mim.

Agradeço antecipadamente

MikeD
fonte
2
Um wiki muito útil que está atualizado e menciona muitas boas práticas é o wiki de Greg . O guia Bash e as perguntas freqüentes são particularmente úteis.

Respostas:

5
  • testé um shell interno que (obviamente) testa alguma condição. Algumas conchas mais antigas precisam de um comando especial. Então você encontrará também um programa em /usr/bin/test.
  • [também é um programa para testar alguma condição. Este software também precisa de um suporte de fechamento e você pode encontrá-lo em /usr/bin/[.
  • [[…]]é uma alternativa para teste [. Foi desenvolvido para o shell Korn ( ksh). Mas você também o encontra nas versões do Bash maiores que 2 e no Z Shell. Os colchetes duplos têm alguns recursos bacanas:
    • O shell não faz divisão de palavras ou expansão de nome de arquivo.
    • Você não precisa citar.
    • Em vez de -a(AND) ou -o(OR), você pode usar &&ou ||.
    • O =pode fazer muito mais.
  • ((…))é equivalente a let. Então basicamente ((expression))é o mesmo que let "expression". No entanto, letvocê pode usar mais de uma expressão, mas os colchetes duplos permitem apenas uma expressão.
  • $((…))(e também $[…]) faz algum cálculo. Seu shell tenta calcular a expressão dentro dos chavetas e substitui a expressão pelo resultado. Então echo $((1+1))leva a echo 2. Então suas conchas imprimem o número 2.

Sempre que quiser comparar dois números, use a opção com um traço e duas letras ( -ge, -ltetc.). Se você quiser comparar strings, use =ou !=.

Sua pergunta sobre escapar é bastante difícil de responder. Porque depende do software que você usa além do shell. Então, ou seja, grepe grep -Eprecisa escapar diferente. Este é também o caso com sed, awke outros. Portanto, a melhor opção é dar uma olhada na página de manual. Depois de algum tempo, você se acostuma e sabe quando usar o escape.

qbi
fonte
obrigado. mais uma pergunta - porque é possível fazer comparação usando ((...)) - é mais comum usar esta versão: if ((2> 1)) OU this: if [[2 -gt 1]]
MikeD
Eu diria que isso if [ 2 -gt 1 ]; …é mais comum, porque eu vejo isso mais frequentemente em scripts de shell e, tanto quanto sei, isso é compatível com POSIX.
QBI
Outro aspecto a ter em mente é que [expressão] é verdadeira se a expressão é avaliada como / retorna zero, mas ((expressão)) é verdadeira se a expressão é avaliada como / retorna não-zero.
Joe