Diferença entre '>' e '-gt'

Diferença entre '>' e '-gt'

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 castum 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 IFseção todas as vezes.

Responder1

Originalmente, [foi implementado como um comando comum, idêntico a, testexceto 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 $xe $ysã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 -ltand 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 exprutilitário; é um dos poucos usos exprque não foi incluído nos recursos dos shells POSIX. Mas cuidado, pois exprusa o mesmo operador para comparações numéricas e de strings, então expr 9 \< 10but expr a9 \> a10.
² Se as strings são interpretadas como strings de bytes ou como strings de caracteres na localidade atual, depende do shell

informação relacionada