Minulla on tämä komentosarja, mutta se ei toimi. Luulen, että se ei pysty arvioimaan if-lauseen numeroiden vertailua.
#!/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
Kuinka korjaan tämän?
Kommentit
Vastaa
Komentosarjalla on useita ongelmia:
-
bash
testit joko suoritetaantest
,[ .. ]
tai[[ .. ]]
kanssa;(
..)
tarkoittaa alikuorta -
Tehtävä tehdään ilman välilyöntejä,
x = 1920
kutsuu komennonx
parametreilla=
ja1920
. Käytä sen sijaanx=1920
. -
Muuttujien nimissä on oltava etuliite dollarimerkillä, kun niitä käytetään. Joten
== x
on huono ja== $x
hyvä. (Lukuun ottamatta aritmeettisia arviointeja tai laajennuksia:(( ... ))
tai$(( ... ))
-kommentin ansiosta Kusalananda ). -
Numeroita tulisi verrata
-eq
,=
on tarkoitettu merkkijonojen vertailuun. Sinun pitäisi myös toimia, koska numerot tallennetaan todennäköisesti identtisesti, mutta on parempi käyttää käsitteellisesti oikeaa operaattoria.==
on epätyypillinen vastaava kuin=
. -
Sinun tulisi tottua muuttujien kaksinkertaiseen lainaamiseen mahdollisuuksien mukaan, mikä estää esimerkiksi huijaamisen.
Korjaan vain linjat, jotka alkavat x = 1920
, kiinteä versio on:
x=1920 if [ "$WIDTH" -eq "$x" ] then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi
Kommentit
- Kolmannesta pisteestäsi: Lukuun ottamatta aritmeettisia arviointeja tai laajennuksia:
(( ... ))
tai$(( ... ))
.
vastaus
Kuten muut vastaukset totesivat, (...)
osoittaa alikuoren. Aritmeettinen laajennus on ((...))
, joten bash
tapauksessa sinun tulisi käyttää ((...))
tai [[
tai POSIXly [
. ((
voidaan käyttää näin:
$ if ((1==1)); then echo "YES" ;fi YES
Huomaa kuitenkin, että [[
, ==
-operaattori osoittaa mallin vastaavuuden, ts. Se ei ole aritmeettinen vertailu.
Vaihtoehtoisesti, jos todella haluat käyttää ==
-operaattoria POSIX-kuoren kanssa, voit tehdä seuraavaa:
$ 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-komentotulkin tapauksessa /bin/sh
ei ole ((
-operaattoria, mutta $((
, joka laajenee aritmeettisen lausekkeen tulokseen. Sen sisällä olevat vertailuoperaattorit toimivat C-tyyppisellä tavalla, jossa 1 osoittaa oikean tuloksen ja 0 väärän tuloksen (toisin kuin tavallinen kuorintapa) , missä 0 on menestys ja ei-nolla on epäonnistuminen).
Vastaa
if(a == b)
ei ole oikea syntaksi kokonaislukujen vertailulle. Lisäksi kutsut x
ilmoittamatta, että se on muuttuja, joten verrataan (div id = ”154888da7d”>
kirjaimellisella merkkijonolla x
. Yritä sen sijaan:
if [[ $WIDTH -eq $x ]]
kommentteja
- Lainaa muuttujasi. Tehtävä
x
on yhtä vankka. - Kun lainaan muuttujia
[[ [...] ]]
-rakenteissa, minulle kerrotaan Älä ' tarvitse. Kun en ' t, minulle kerrotaan, että minun pitäisi. En voi voittaa. - -1 | Sillä olet käyttänyt
[[ .. ]]
, kun se ei ole välttämätöntä. Tällöin tulisi käyttää tavallista testikomentoa. - @Vlastimil mitä varten? Tämä on bash-käsikirjoitus. Siellä ' ei ole syytä käyttää
[
lainkaan. - Jos ' käytettäessä
bash
ei ole kirjaimellisesti mitään syytä koskaan käyttää[ [...] ]
-rakennetta, joka on sekä osajoukko että alttiimpi epäonnistuminen PICNIC-ongelmien vuoksi.
vastaus
Kokeile tätä:
# 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
Selitys:
- Älä laita
bash
-kenttään välilyöntiä=
arvojen osoittaminen; esimerkkix=123
, eix = 123
. - Voit verrata asioita kohtaan
bash
, käytä[[ .. ]]
. -
xdotool
on jogetwindowgeometry --shell
bash
ohjelmointi.
kommentit
- -1 | Sillä olet käyttänyt
eval
ja`
tarpeettomasti
-eq
tasa-arvoisille jne.