Mam ten skrypt, ale nie działa. Jest tak, ponieważ wydaje mi się, że nie jest w stanie ocenić porównania liczb w instrukcji if.
#!/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
Jak mogę to naprawić?
Komentarze
Odpowiedź
Jest kilka problemów ze skryptem:
-
bashtesty są albo gotowe ztest,[ .. ]lub[[ .. ]];(..)oznacza podpowłokę -
Przypisania są wykonywane bez spacji,
x = 1920wywoła poleceniexz parametrami=i1920. Zamiast tego użyjx=1920. -
Nazwy zmiennych muszą być poprzedzone znakiem dolara, gdy ich używasz. Więc
== xjest zły, a== $xjest dobry. (Z wyjątkiem obliczeń arytmetycznych lub rozszerzeń:(( ... ))lub$(( ... )), dzięki komentarzowi Kusalananda ). -
Liczby należy porównać z
-eq,=służy do porównania ciągów. W twoim przypadku powinno to również działać, ponieważ liczby prawdopodobnie będą przechowywane identycznie, ale lepiej jest użyć poprawnego koncepcyjnie operatora.==to niestandardowy odpowiednik=. -
Powinieneś przyzwyczaić się do podwójnego cytowania zmiennych wszędzie tam, gdzie jest to możliwe, co na przykład zapobiega globowaniu.
Poprawię tylko linie zaczynające się od x = 1920, poprawiona wersja to:
x=1920 if [ "$WIDTH" -eq "$x" ] then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi
Komentarze
- O trzecim punkcie: Z wyjątkiem obliczeń arytmetycznych lub rozszerzeń:
(( ... ))lub$(( ... )).
Odpowiedź
Jak zauważyły inne odpowiedzi, (...) wskazuje podpowłokę. Rozwinięcie arytmetyczne to ((...)), więc w przypadku bash należy użyć ((...)) lub [[ lub POSIXly [. Element (( może być używany w następujący sposób:
$ if ((1==1)); then echo "YES" ;fi YES
Należy jednak pamiętać, że w przypadku [[, operator == wskazuje na dopasowanie do wzorca, tj. Nie jest to porównanie arytmetyczne.
Alternatywnie, jeśli naprawdę chcesz użyć operatora == z powłoką POSIX, możesz wykonać następujące czynności:
$ 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
W przypadku powłoki POSIX /bin/sh nie ma operatora ((, jednak istnieje $((, co jest interpretowane jako wynik wyrażenia arytmetycznego. Operatory porównania w nim działają w sposób podobny do C, gdzie 1 oznacza prawdziwy wynik, a 0 wskazuje fałszywy wynik (w przeciwieństwie do zwykłej powłoki , gdzie 0 to sukces, a wartość niezerowa to porażka).
Odpowiedź
if(a == b) nie jest właściwą składnią do porównania liczb całkowitych Dodatkowo wywołujesz x bez wskazywania, że jest to zmienna, więc próbujesz (próbujesz) porównać wartość z ciągiem literału x. Spróbuj zamiast tego:
if [[ $WIDTH -eq $x ]]
Komentarze
- Cytuj swoją zmienną. Przypisanie do
xjest równie błędne. - Kiedy cytuję zmienne w konstrukcjach
[[ [...] ]], powiedziano mi, że nie ' nie trzeba. Kiedy nie ' t, powiedziano mi, że powinienem. Nie mogę wygrać. - -1 | Ponieważ użyłeś
[[ .. ]], gdy nie jest to konieczne. W takim przypadku należy użyć zwykłego polecenia testowego. - @Vlastimil w jakim celu? To jest skrypt bash. ' nie ma żadnego powodu, aby w ogóle używać
[. - Jeśli ' ponownie używając
bash, dosłownie nie ma powodu, aby kiedykolwiek używać konstrukcji[ [...] ], która jest jednocześnie podzbiorem i bardziej podatną na awaria z powodu problemów z PICNIC.
Odpowiedź
Spróbuj:
# 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
Wyjaśnienie:
- W
bashnie umieszczaj spacji wokół=, gdy przypisywanie wartości; przykładx=123, a niex = 123. - Aby porównać rzeczy w
bashużyj[[ .. ]]. -
xdotoolma jużgetwindowgeometry --shelldlabashprogramowanie.
Komentarze
- -1 | Ponieważ użyłeś
evali`niepotrzebnie
-eqdla równości itp.