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
Resposta
Existem vários problemas com o script:
-
bashos testes são feitos comtest,[ .. ]ou[[ .. ]];(..)significa sub-shell -
As atribuições são feitas sem espaços,
x = 1920chamará o comandoxcom os parâmetros e1920. Usex=1920em 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:
- Em
bash, não coloque espaço (s) ao redor quando atribuição de valores; exemplox=123, nãox = 123. - Para comparar coisas em
bash, use[[ .. ]]. -
xdotooljá temgetwindowgeometry --shellparabashprogramação.
Comentários
- -1 | Pois você usou
evale`desnecessariamente
-eqpara igual, etc.