Como posso comparar os números no bash?

Eu tenho este script, mas não está funcionando. É porque ele está falhando ao avaliar a comparação de números na instruçã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?

Comentários

  • Use comparações numéricas adequadas – -eq para igual, etc.
  • Se você ' está feliz com uma ou várias das respostas, vote nelas. Se alguém estiver resolvendo seu problema, aceitá-lo seria a melhor maneira de dizer " Obrigado! " Aceitar uma resposta também indica aos futuros leitores que a resposta realmente resolveu o problema.

Resposta

Existem vários problemas com o script:

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

  • As atribuiçõ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. Portanto, == 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 strings. No seu caso, também deve funcionar, uma vez que é 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 a .

  • Você deve se acostumar a dobrar aspas de variáveis em todos os lugares quando possível, o que evita globbing, 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 

Comentários

  • Sobre seu terceiro ponto: Exceto dentro de avaliações aritméticas ou expansões: (( ... )) ou $(( ... )).

Resposta

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

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

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

Como alternativa, se você realmente deseja 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á operador ((, mas há $((, que se expande para o resultado de uma expressão aritmética. Os operadores de comparação dentro dela agem de maneira semelhante a C, em que 1 indica um resultado verdadeiro e 0 indica um resultado falso (em oposição à forma usual de shell , onde 0 é sucesso e diferente de zero é falha).

Resposta

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

if [[ $WIDTH -eq $x ]] 

Comentários

  • Cite sua variável. A atribuição a x é igualmente problemática.
  • Quando cito variáveis em construções [[ [...] ]], fico sabendo que não ' não precisa. Quando eu não ' t, recebo a instrução de que devo. Não posso vencer.
  • -1 | Pois você usou [[ .. ]] quando não era necessário. O comando de teste comum deve ser usado nesse caso.
  • @Vlastimil para quê? Este é um script bash. Não há ' s nenhuma razão para usar [.
  • Se você ' ao usar bash, literalmente não há razão para usar a construção [ [...] ] que é um subconjunto e mais propensa a falha devido a problemas de PICNIC.

Resposta

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]+.*$/\1/;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) ao redor quando atribuição de valores; exemplo x=123, não x = 123.
  2. Para comparar coisas em bash, use [[ .. ]].
  3. xdotool já tem getwindowgeometry --shell para bash programação.

Comentários

  • -1 | Pois você usou eval e ` desnecessariamente

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *