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:
-
bash
os testes são feitos comtest
,[ .. ]
ou[[ .. ]]
;(
..)
significa sub-shell -
As atribuições são feitas sem espaços,
x = 1920
chamará o comandox
com os parâmetros e1920
. Usex=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:
- 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[[ .. ]]
. -
xdotool
já temgetwindowgeometry --shell
parabash
programação.
Comentários
- -1 | Pois você usou
eval
e`
desnecessariamente
-eq
para igual, etc.