Mám tento skript, ale nefunguje. Je to proto, že se mi nedaří vyhodnotit srovnání čísel v příkazu if. Myslím, že.
#!/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 to mohu opravit?
Komentáře
Odpověď
Skript má několik problémů:
-
bashtesty jsou buď hotové stest,[ .. ]nebo[[ .. ]];(..)znamená dílčí prostředí -
Přiřazení se provádí bez mezer,
x = 1920zavolá příkazxs parametry=a1920. Místo toho použijtex=1920. -
Když použijete názvy proměnných, musí před nimi být znak dolaru.
== xje tedy špatný a== $xdobrý. (S výjimkou aritmetických hodnocení nebo rozšíření:(( ... ))nebo$(( ... )), díky komentáři Kusalananda ). -
Čísla by měla být porovnávána s
-eq,=je pro porovnání řetězců. Ve vašem případě by to také mělo fungovat, protože čísla budou pravděpodobně uložena shodně, ale je lepší použít koncepčně správný operátor.==je nestandardní ekvivalent k=. -
Měli byste si zvyknout na zdvojnásobení uvozovek proměnných, kdykoli je to možné, což například brání globování.
Já jen opravím řádky počínaje x = 1920, pevná verze je:
x=1920 if [ "$WIDTH" -eq "$x" ] then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi
Komentáře
- O vašem třetím bodě: Kromě aritmetických hodnocení nebo rozšíření:
(( ... ))nebo$(( ... )).
odpověď
Jak poznamenaly další odpovědi, (...) označuje subshell. Aritmetická expanze je ((...)), takže v případě bash byste měli používat ((...)) nebo [[ nebo POSIXly [. (( lze použít takto:
$ if ((1==1)); then echo "YES" ;fi YES
Upozorňujeme však, že v případě [[ operátor == označuje shodu vzorů, tj. Nejde o aritmetické srovnání.
Alternativně, pokud opravdu chcete použít operátor == s POSIX shell, můžete provést následující:
$ 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
V případě prostředí POSIX shell /bin/sh neexistuje žádný (( operátor, existuje však $((, který se rozšíří na výsledek aritmetického výrazu. Operátory porovnání v něm fungují způsobem typu C, kde 1 označuje skutečný výsledek a 0 označuje falešný výsledek (na rozdíl od obvyklého způsobu prostředí , kde 0 je úspěch a nenulová selhání).
Odpověď
if(a == b) není správná syntaxe pro celočíselné srovnání Navíc vyvoláte x, aniž byste označili, že jde o proměnnou, takže se (snažíte) porovnávat hodnotu $WIDTH s doslovným řetězcem x. Zkuste místo toho:
if [[ $WIDTH -eq $x ]]
Komentáře
- Uveďte svou proměnnou. Přiřazení
xje stejně chybné. - Když cituji proměnné v konstrukcích
[[ [...] ]], řeknu mi nemusíte ' muset. Když ' t nedostanu, bylo mi řečeno, že bych měl. Nemohu vyhrát. - -1 | Použili jste
[[ .. ]], pokud to není nutné. V takovém případě by měl být použit obyčejný testovací příkaz. - @Vlastimil pro cokoli? Toto je bash skript. ' Není důvod vůbec
[používat. - Pokud ' Při použití
bashnení doslova žádný důvod použít konstrukci[ [...] ], která je podmnožinou i náchylnější k selhání kvůli problémům PICNIC.
Odpověď
Zkuste toto:
# 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
Vysvětlení:
- V
bashnedávejte prostor kolem=, když přiřazování hodnot; příkladx=123, nex = 123. - Porovnání věcí v
bash, použijte[[ .. ]]. -
xdotooljižgetwindowgeometry --shellprobashprogramování.
Komentáře
- -1 | Protože jste použili
evala`zbytečně
-eqpro rovnocenné atd.