Qual é a diferença entre estes:
SEC=$(mysql -hxxx -Pxxx -uxxx -pxxx -se "SELECT Seconds FROM tablename")
SEC=100
Ambos retornam o mesmo resultado (100). Mas quando eu testo com:
if [ ${SEC} > 1 ]
then
echo "SEC GT 1"
else
echo "SEC LT 1"
fi
O primeiro retorna:
"SEC GT 1"
O segundo retorna:
"SEC LT 1"
Se, no entanto, eu mudar para:
if [ ${SEC} -gt 1 ]
então o resultado é invertido.
Presumo que tenha algo a ver com o tipo de dados e que provavelmente preciso de cast
um ou de outro para obter o mesmo resultado.
Só que no momento isso está atrapalhando meus testes, pois tenho que me lembrar de mudar a IF
seção todas as vezes.
Responder1
Originalmente, [
foi implementado como um comando comum, idêntico a, test
exceto que [
espera um argumento extra no final que deve ser ]
. (Ele ainda existe como um comando comum, mas a maioria dos shells também os possui como integrados.) Dado que é um comando comum sujeito à análise comum, ele não poderia usar operadores matemáticos <
e >
sem aspas: [ ${SEC} > 1 ]
contém um operador de redirecionamento, é equivalente para [ ${SEC} ] >1
, redirecionando a saída (vazia) do [
comando para o arquivo chamado 1
. O [
comando segue principalmente a convenção usual de fazer opções especiais começando com um travessão: a maioria de seus operadores começa com um travessão. Portanto, há que [ -r foo ]
testar se um arquivo é legível, [ -r foo -a -w bar ]
combinar dois testes com o operador “e”, [ $x -eq $y ]
testar se $x
e $y
são iguais, etc.
Esses shells mais antigos tinham igualdade de strings (o =
operador, um dos poucos que se desvia da convenção de letras e traços), mas não ordenação de strings¹. Eles tinham comparações numéricas, por exemplo, [ $x -le $y ]
para testar se o número inteiro $x
é menor ou igual a $y
, e esse conjunto de operadores inclui igualdade numérica, [ $x -eq $y ]
pois [ 010 -eq 8 ]
um zero à esquerda significa que o número está em octal.
Ksh introduziu a sintaxe [[ … ]]
, também disponível agora em bash e zsh. Ao contrário de [ … ]
, que é um comando comum, [[ … ]]
é reconhecido pelo analisador do shell e, portanto, caracteres especiais como (
e <
podem ser usados sem aspas (e, de fato, não devem ser entre aspas). Visto que -lt
and friends já estavam disponíveis para comparações numéricas, e =
já estava fazendo uma comparação de strings, <
e friends foram feitos operadores de comparação de strings (ordem lexicográfica¹). Assim, por exemplo, [ 9 -lt 10 ]
mas [[ 10 < 9 ]]
.
¹ A ordenação de strings está disponível com o expr
utilitário; é um dos poucos usos expr
que não foi incluído nos recursos dos shells POSIX. Mas cuidado, pois expr
usa o mesmo operador para comparações numéricas e de strings, então expr 9 \< 10
but expr a9 \> a10
.
² Se as strings são interpretadas como strings de bytes ou como strings de caracteres na localidade atual, depende do shell