Jeg har dette skriptet, men det fungerer ikke. Det er fordi det ikke klarer å evaluere tallsammenligningen i if-setningen, tror jeg.
#!/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 fikse dette?
Kommentarer
Svar
Det er flere problemer med skriptet:
-
bash
tester er enten gjort medtest
,[ .. ]
eller[[ .. ]]
;(
..)
betyr underskall -
Oppgave gjøres uten mellomrom,
x = 1920
vil ringe kommandoenx
med parametrene=
og1920
. Brukx=1920
i stedet. -
Variablenavn må være foran et dollartegn når du bruker dem. Så
== x
er dårlig og== $x
er bra. (Unntatt innen aritmetiske evalueringer eller utvidelser:(( ... ))
eller$(( ... ))
, takket være kommentar fra Kusalananda ). -
Tall skal sammenlignes med
-eq
,=
er for strengesammenligning. I ditt tilfelle bør det også fungere siden tallene sannsynligvis blir lagret identisk, men det er bedre å bruke den konseptuelt korrekte operatoren.==
er en ikke-standard som tilsvarer=
. -
Du bør venne deg til å doble sitering av variabler overalt når det er mulig, noe som for eksempel forhindrer globbing.
Jeg fikser bare linjene fra x = 1920
, den faste versjonen 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 ditt tredje punkt: Unntatt innen aritmetiske evalueringer eller utvidelser:
(( ... ))
eller$(( ... ))
.
Svar
Som andre svar bemerket, (...)
indikerer subshell. Aritmetisk utvidelse er ((...))
, så i tilfelle bash
bør du bruke ((...))
eller [[
, eller POSIXly [
. ((
kan brukes slik:
$ if ((1==1)); then echo "YES" ;fi YES
Vær imidlertid oppmerksom på at i tilfelle [[
, ==
-operatøren indikerer mønstermatching, dvs. det er ikke aritmetisk sammenligning.
Alternativt, hvis du virkelig vil bruke ==
operatør med POSIX-skall, kan man gjø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 tilfelle av POSIX-skall /bin/sh
er det ingen ((
operatør, men det er $((
, som utvides til resultatet av et aritmetisk uttrykk. Sammenligningsoperatører i det handler på en C-lignende måte, hvor 1 indikerer et sant resultat, og 0 indikerer et falskt resultat (i motsetning til vanlig shell-måte , hvor 0 er suksess og ikke-null er feil).
Svar
if(a == b)
er ikke riktig syntaks for en heltalssammenligning. I tillegg påkaller du x
uten å indikere at det er en variabel, så du (prøver å) sammenligne verdien av $WIDTH
med bokstavstrengen x
. Prøv i stedet:
if [[ $WIDTH -eq $x ]]
Kommentarer
- Sitat på variabelen din. Oppgaven til
x
er like buggy. - Når jeg siterer variabler i
[[ [...] ]]
konstruksjoner, får jeg beskjed om at jeg trenger ikke '. Når jeg ikke ' t, får jeg beskjed om at jeg burde. Jeg kan ikke vinne. - -1 | For du har brukt
[[ .. ]]
når det ikke er nødvendig. Vanlig testkommando bør brukes i et slikt tilfelle. - @Vlastimil hva til? Dette er et bash-skript. Det er ' ingen grunn til å bruke
[
i det hele tatt. - Hvis du ' Når du bruker
bash
, er det bokstavelig talt ingen grunn til å bruke[ [...] ]
-konstruksjonen som både er en delmengde og mer utsatt for feil på grunn av 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
, ikke plasser mellomrom=
tilordne verdier; eksempelx=123
, ikkex = 123
. - For å sammenligne ting i
bash
, bruk[[ .. ]]
. -
xdotool
har alleredegetwindowgeometry --shell
ibash
programmering.
Kommentarer
- -1 | For du har brukt
eval
og`
unødvendig
-eq
for lik, etc.