Como faço para comparar números no bash?

0

Eu tenho esse script, mas não está funcionando. É porque está falhando em avaliar a comparação de números na declaração if, eu acho.

#!/bin/bash

{ read __ WIDTH; read __ HEIGHT; read __ __ BORDER_WIDTH; } < <(xwininfo -id "$(xdotool getactivewindow)" | grep -o -e 'Height:.*' -e 'Width:.*' -e 'Border width:.*')
echo "Height: $HEIGHT, Width: $WIDTH, Border width: $BORDER_WIDTH"

x = 1920
if($WIDTH == x)
then
    wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz 
else 
    xdotool key Ctrl+F12
fi

Como posso corrigir isso?

    
por daljit97 30.01.2018 / 20:26

4 respostas

8

Existem vários problemas com o script:

  • bash testes são feitos com test , [ .. ] ou [[ .. ]] ; ( .. ) significa sub-shell

  • As designações são feitas sem espaços, x = 1920 chamará o comando x com os parâmetros = e 1920 . Use x=1920 em vez disso.

  • Os nomes das variáveis precisam ser prefixados com um cifrão quando você os usa. Então, == x é ruim e == $x é bom. (Exceto em avaliações aritméticas ou expansões: (( ... )) ou $(( ... )) , graças ao comentário de Kusalananda ).

  • Os números devem ser comparados com -eq , = é para comparação de string. No seu caso, também deve funcionar, pois é provável que os números sejam armazenados de forma idêntica, mas é melhor usar o operador conceitualmente correto. == é um equivalente não padrão para = .

  • Você deve se acostumar a duplicar as variáveis em todos os lugares quando possível, o que impede a globulação, por exemplo.

Vou apenas corrigir as linhas a partir de x = 1920 , a versão corrigida é:

x=1920
if [ "$WIDTH" -eq "$x" ]
then
    wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz 
else 
    xdotool key Ctrl+F12
fi
    
por 30.01.2018 / 20:34
1

if(a == b) não é a sintaxe adequada para uma comparação de números inteiros Além disso, você invoca x sem indicar que seja uma variável, portanto, você está (tentando) comparar o valor de $WIDTH com a string literal x . Tente em vez disso:

if [[ $WIDTH -eq $x ]]
    
por 30.01.2018 / 20:29
1

Como outras respostas, (...) indica subshell. A expansão aritmética é ((...)) , portanto, no caso de bash , você deve usar ((...)) ou [[ ou POSIXly [ . O (( pode ser usado assim:

$ if ((1==1)); then echo "YES" ;fi
YES

Observe, no entanto, que no caso de [[ , o operador == indica correspondência de padrões, ou seja, não é uma comparação aritmética.

Alternativamente, se você realmente quiser usar o operador == com o shell POSIX, pode-se fazer o seguinte:

$ foo=1
$ bar=2
$ if [ $((foo==bar)) -eq 1 ]; then echo "YES"; else echo "NO"; fi
NO
$ bar=1
$ if [ $((foo==bar)) -eq 1 ]; then echo "YES"; else echo "NO"; fi
YES

No caso do shell POSIX /bin/sh , não há (( operator, no entanto, há $(( , que se expande para o resultado de uma expressão aritmética. Os operadores de comparação dentro dele agem de uma maneira semelhante a C, em que 1 indica um resultado verdadeiro e 0 indica um resultado falso (em oposição à maneira usual de shell, em que 0 é sucesso e não-zero é falha).

    
por 30.01.2018 / 20:56
-1

Tente isto:

# use xrandr+sed to get current screen width
screenWidth='xrandr|sed -En '/connected [0-9]+x[0-9]+/{s/^.*connected ([0-9]+)x[0-9]+.*$//;p}''

# use xdotool getwindowgeometry --shell to get size/pos of window
eval 'xdotool getactivewindow getwindowgeometry --shell'

echo $screenWidth $WIDTH # debug, to see values got from xrandr and xdotool

if [[ $WIDTH = $screenWidth ]]; then
  wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz 
else 
  xdotool key Ctrl+F12
fi

Explicação:

  1. Em bash , não coloque espaço (s) arround = ao atribuir valores; exemplo x=123 , não x = 123 .
  2. Para comparar as coisas em bash , use [[ .. ]] .
  3. xdotool já tem getwindowgeometry --shell para bash programação.
por 31.01.2018 / 08:50