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:
-
bash
test er enten udført medtest
,[ .. ]
eller[[ .. ]]
;(
..)
betyder underskal -
Tildeling foretages uden mellemrum,
x = 1920
kalder kommandoenx
med parametrene=
og1920
. Brugx=1920
i stedet. -
Variabelnavne skal have forud for et dollartegn, når du bruger dem. Så
== x
er dårlig, og== $x
er 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
x
er 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
bash
er 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
bash
skal du ikke sætte mellemrum (r) omkring=
tildeling af værdier eksempelx=123
, ikkex = 123
. - For at sammenligne ting i
bash
, brug[[ .. ]]
. -
xdotool
har alleredegetwindowgeometry --shell
tilbash
programmering.
Kommentarer
- -1 | For du har brugt
eval
og`
unødvendigt
-eq
for lige osv.