Jeg har dette script, men det fungerer ikke. Jeg tror, at det ikke evaluerer sammenligningen af tal i if-sætningen.
#!/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
Hvordan kan jeg løse dette?
Kommentarer
Svar
Der er flere problemer med scriptet:
-
bashtest er enten udført medtest,[ .. ]eller[[ .. ]];(..)betyder underskal -
Tildeling foretages uden mellemrum,
x = 1920kalder kommandoenxmed parametrene=og1920. Brugx=1920i stedet. -
Variabelnavne skal have forud for et dollartegn, når du bruger dem. Så
== xer dårlig, og== $xer godt. (Undtagen inden for aritmetiske evalueringer eller udvidelser:(( ... ))eller$(( ... ))takket være kommentar fra Kusalananda ). -
Tal skal sammenlignes med
-eq,=er til strengesammenligning. I dit tilfælde skal det også fungere, da tallene sandsynligvis gemmes identisk, men det er bedre at bruge den konceptuelt korrekte operator.==er en ikke-standardækvivalent med=. -
Du skal vænne dig til at dobbeltkaste variabler overalt, når det er muligt, hvilket forhindrer globbing f.eks. >
Jeg retter bare linierne startende fra x = 1920, den faste version er:
x=1920 if [ "$WIDTH" -eq "$x" ] then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi
Kommentarer
- Om dit tredje punkt: Undtagen inden for aritmetiske evalueringer eller udvidelser:
(( ... ))eller$(( ... )).
Svar
Som andre svar bemærkede, (...) angiver subshell. Aritmetisk udvidelse er ((...)), så i tilfælde af bash skal du bruge ((...)) eller [[ eller POSIXly [. (( kan bruges som sådan:
$ if ((1==1)); then echo "YES" ;fi YES
Bemærk dog, at i tilfælde af [[, == -operatøren angiver mønstermatchning, dvs. det er ikke aritmetisk sammenligning.
Alternativt, hvis du virkelig vil bruge == operatør med POSIX shell, kan man gøre følgende:
$ 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
I tilfælde af POSIX-shell /bin/sh er der ingen (( operatør, men der er $((, der udvides til resultatet af et aritmetisk udtryk. Sammenligningsoperatorer inden for det handler på en C-lignende måde, hvor 1 angiver et sandt resultat, og 0 angiver et falsk resultat (i modsætning til den sædvanlige shell-måde , hvor 0 er succes, og ikke-nul er fejl).
Svar
if(a == b) er ikke den korrekte syntaks til en heltalesammenligning Derudover påkalder du x uden at angive, at det er en variabel, så du (prøver at) sammenligne værdien af $WIDTH med den bogstavelige streng x. Prøv i stedet:
if [[ $WIDTH -eq $x ]]
Kommentarer
- Citér din variabel. Opgaven til
xer lige så buggy. - Når jeg citerer variabler i
[[ [...] ]]konstruktioner, får jeg at vide, at jeg behøver ikke '. Når jeg ikke ' t, får jeg at vide, at jeg burde. Jeg kan ikke vinde. - -1 | For du har brugt
[[ .. ]]når det ikke er nødvendigt. Almindelig testkommando skal bruges i et sådant tilfælde. - @Vlastimil hvad til? Dette er et bash-script. Der er ' overhovedet ingen grund til at bruge
[. - Hvis du ' ved brug af
basher der bogstaveligt talt ingen grund til nogensinde at bruge[ [...] ]-konstruktionen, som både er en delmængde og mere tilbøjelig til fejl på grund af PICNIC-problemer.
Svar
Prøv dette:
# 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
Forklaring:
- I
bashskal du ikke sætte mellemrum (r) omkring=tildeling af værdier eksempelx=123, ikkex = 123. - For at sammenligne ting i
bash, brug[[ .. ]]. -
xdotoolhar alleredegetwindowgeometry --shelltilbashprogrammering.
Kommentarer
- -1 | For du har brugt
evalog`unødvendigt
-eqfor lige osv.