Estou começando a aprender a escrever scripts para o terminal bash, mas não consigo descobrir como fazer as comparações funcionarem corretamente. O script que estou usando é:
echo "enter two numbers";
read a b;
echo "a=$a";
echo "b=$b";
if [ $a \> $b ];
then
echo "a is greater than b";
else
echo "b is greater than a";
fi;
O problema é que ele compara o número a partir do primeiro dígito, ou seja, 9 é maior que 10, mas 1 é maior que 09.
Como posso converter os números em um tipo para fazer uma comparação verdadeira?
;
final da linha será supérfluo. Não causando nenhum dano, apenas um desperdício de teclas (a menos que você goste de digitar ponto-e-vírgula).10#$number
anumber=09; echo "$((10#$number))"
saída9
whileecho $((number))
produzirá um erro "valor muito alto para a base".>
operador faz no[
comando é comparar a ordem em que duas strings devem ser classificadas, em vez da ordem em que elas serão classificadas como números. Você pode encontrar mais informações emman test
.Respostas:
No bash, você deve fazer sua verificação no contexto aritmético :
Para shells POSIX que não suportam
(())
, você pode usar-lt
e-gt
.Você pode obter uma lista completa dos operadores de comparação com
help test
ouman test
.fonte
"$a" -gt "$b"
é a resposta certa. Aqui está uma boa lista de operadores de teste: Construções de Teste .test
é um programa como está[
. Então,help test
dá informações sobre isso. Para descobrir quais os internos ([[
e((
) você deve usarhelp bash
e navegar para essa parte.Claro e simples
Você pode conferir esta folha de dicas se quiser mais comparações numéricas no maravilhoso mundo do Bash Scripting.
Em pouco tempo, números inteiros só podem ser comparados com:
fonte
"$a"
e"$b"
não são estritamente necessárias, mas são uma boa prática. Aparelhos encaracolados não fazem nada de útil aqui."
obrigatórias ou[ $a -eq $b ]
também estão bem?Há também uma coisa agradável que algumas pessoas podem não saber:
Este código imprimirá o menor número de
a
eb
fonte
b
sea == b
.echo "The smaller number is $(( a < b ? a : b ))."
a < b
ainda é verdade sea == b
. Não conheço todos os caprichos dos condicionais de Bash, mas há quase certamente situações em que isso faria diferença.a == b
, em seguida,a < b
avalia a falsa, é por isso que iria imprimirb
.No Bash, prefiro fazer isso, pois se trata mais de uma operação condicional, diferente da utilização
(( ))
de aritmética.A menos que eu faça coisas complexas como
Mas todo mundo só tem suas próprias preferências. O triste é que algumas pessoas impõem seus padrões não oficiais.
Atualizar:
Na verdade, você também pode fazer isso:
O que permite adicionar outra coisa com a qual você poderia fazer
[[ ]]
além de coisas aritméticas.fonte
[[ ]]
força um contexto aritmético como(( ))
, ondeN
é tratado como se fosse$N
, mas não acho que isso esteja correto. Ou, se não era essa a intenção, o usoN
eM
é confuso.[[
comando,Arg1
eArg2
são avaliados como expressões aritméticas [...]".NUMBER=0.0; while [[ "$NUMBER" -lt "1.0" ]]; do
e diz #bash: [[: 0.0: syntax error: invalid arithmetic operator (error token is ".0")
Este código também pode comparar carros alegóricos. Ele está usando o awk (não é puro bash), no entanto, isso não deve ser um problema, pois o awk é um comando POSIX padrão que provavelmente é enviado por padrão com o sistema operacional.
Para torná-lo mais curto para uso, use esta função:
fonte
bash
não consegue compará-los adequadamente (tenteif (( 18446744073692774399 < 8589934592 )); then echo 'integer overflow'; fi
).awk
funciona como um encanto (if awk "BEGIN {return_code=(18446744073692774399 > 8589934592) ? 0 : 1; exit} END {exit return_code}"; then echo 'no integer overflow'; fi
).Se você possui carros alegóricos, pode escrever uma função e usá-la, por exemplo
fonte
O material do colchete (por exemplo,
[[ $a -gt $b ]]
ou(( $a > $b ))
) não é suficiente se você quiser usar números flutuantes também; relataria um erro de sintaxe. Se você quiser comparar números flutuantes ou números flutuantes com números inteiros, use(( $(bc <<< "...") ))
.Por exemplo,
Você pode incluir mais de uma comparação na instrução if. Por exemplo,
Isso é útil se você quiser verificar se uma variável numérica (número inteiro ou não) está dentro de um intervalo numérico.
fonte
if [ "$(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b; fi
if [ $(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b"; fi
? (Acho que seu comando foi escrito incorretamente.) Nesse caso, também funciona. O comando Bash Calculator (bc) é um comando básico da calculadora. Mais alguns exemplos de uso encontrados aqui e aqui . Não sei por que meu comando de exemplo não funcionou para você.Eu resolvi isso usando uma função pequena para converter seqüências de caracteres de versão em valores inteiros simples que podem ser comparados:
Isso faz duas suposições importantes:
Por exemplo
Exemplo de teste se o
npm
comando atende ao requisito mínimo ...fonte