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.