Hogyan lehet összehasonlítani a bash számokat?

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

  • Használjon megfelelő numerikus összehasonlításokat – -eq az egyenlőséghez stb.
  • Ha ' elégedett egy vagy több válasszal, szavazzon rájuk. Ha valaki megoldja a problémáját, elfogadása lenne a legjobb módja a " köszönésnek! " A válasz elfogadása a jövő olvasók számára is jelzi, hogy a válasz valóban megoldotta a problémát.

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 a x 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:

  1. A bash mezőbe ne tegyen szóközt (helyeket) = amikor értékek hozzárendelése; példa x=123, nem pedig x = 123.
  2. A bash, használja a [[ .. ]] elemet.
  3. xdotool már rendelkezik getwindowgeometry --shell bash programozás.

Megjegyzések

  • -1 | Mert feleslegesen használta a eval és a ` elemeket

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük