Megvan ez a szkript, de nem működik. Úgy gondolom, hogy nem sikerül értékelni a szám összehasonlítását az if utasításban.
#!/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
Hogyan tudom ezt kijavítani?
Megjegyzések
Válasz
A szkript több problémát is felvet:
-
bash
tesztek vagy elkészültek a következővel:test
,[ .. ]
vagy[[ .. ]]
;(
..)
jelentése alhéj -
A hozzárendelés szóköz nélkül történik, A
x = 1920
ax
parancsot hívja meg a=
és . Használja helyette a következőt:x=1920
. -
A változók nevét dollárjelrel kell ellátni, amikor használja őket. Tehát
== x
rossz, és== $x
jó. (Kivéve a számtani értékeléseket vagy a bővítéseket:(( ... ))
vagy$(( ... ))
, köszönhetően Kusalananda ). -
A számokat össze kell hasonlítani a
-eq
,=
a húrok összehasonlítására szolgál. Az Ön esetében ennek is működnie kell, mivel a számok valószínűleg azonos módon kerülnek tárolásra, de jobb, ha a fogalmilag helyes operátort használjuk. A==
a=
. -
Meg kell szokni a változók dupla idézését, amikor csak lehetséges, ami megakadályozza például a globbingot.
Csak rögzítem a sorokat x = 1920
-től kezdve, a fix verzió:
x=1920 if [ "$WIDTH" -eq "$x" ] then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi
Megjegyzések
- A harmadik pontról: Kivéve az aritmetikai értékeléseket vagy bővítéseket:
(( ... ))
vagy$(( ... ))
.
Válasz
Amint más válaszok megjegyezték, (...)
az alhéjat jelöli. A számtani kiterjesztés ((...))
, ezért bash
esetén a ((...))
vagy [[
vagy POSIXly [
. A ((
így használható:
$ if ((1==1)); then echo "YES" ;fi YES
Vegye figyelembe azonban, hogy , a ==
operátor a minta egyeztetését jelzi, vagyis nem aritmetikai összehasonlítás.
Alternatív megoldásként, ha valóban a ==
operátort szeretné használni POSIX héjjal, a következőket teheti:
$ 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
POSIX shell esetén /bin/sh
nincs ((
operátor, de van $((
, amely egy aritmetikai kifejezés eredményére tágul. Az azon belüli összehasonlító operátorok C-szerűen működnek, ahol 1 igaz eredményt, 0 pedig hamis eredményt mutat (szemben a szokásos shell módszerrel). , ahol 0 a siker és a nem nulla a kudarc).
Válasz
if(a == b)
nem a megfelelő szintaxis egy egész szám összehasonlításához. Ezenkívül a x
-t is meghívja anélkül, hogy azt változónak jelezné, tehát (megpróbálja) összehasonlítani a $WIDTH
a szó szerinti karakterlánccal x
. Próbáljon inkább:
if [[ $WIDTH -eq $x ]]
megjegyzések
- Idézd a változót. A
x
hozzárendelés ugyanolyan hibás. - Amikor a
[[ [...] ]]
konstrukciókban idézek változókat, akkor azt mondják, hogy don ' nem kell. Amikor nem ' t, akkor azt mondják, hogy muszáj. Nem nyerhetek. - -1 | Mert akkor használta a
[[ .. ]]
alkalmazást, amikor nem szükséges. Ilyen esetben szokásos tesztparancsot kell használni. - @Vlastimil minek? Ez egy bash szkript. ' nincs ok a
[
használatára. - Ha ' a
bash
használatával szó szerint soha nincs ok a[ [...] ]
konstrukció használatára, amely egyszerre részhalmaz és hajlamosabb rá kudarc PICNIC problémák miatt.
Válasz
Próbálja ki:
# 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
Magyarázat:
- A
bash
mezőbe ne tegyen szóközt (helyeket)=
amikor értékek hozzárendelése; példax=123
, nem pedigx = 123
. - A
bash
, használja a[[ .. ]]
elemet. -
xdotool
már rendelkezikgetwindowgeometry --shell
bash
programozás.
Megjegyzések
- -1 | Mert feleslegesen használta a
eval
és a`
elemeket
-eq
az egyenlőséghez stb.