Kuinka voin verrata bashin lukuja?

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

  • Käytä asianmukaisia numeerisia vertailuja – -eq tasa-arvoisille jne.
  • Jos ' ole tyytyväinen yhteen tai useampaan vastaukseen, äänestä niitä. Jos joku ratkaisee ongelmasi, sen hyväksyminen olisi paras tapa sanoa " Kiitos! " Vastauksen hyväksyminen osoittaa tuleville lukijoille myös, että vastaus todella ratkaisi ongelman.

Vastaa

Komentosarjalla on useita ongelmia:

  • bash testit joko suoritetaan test, [ .. ] tai [[ .. ]] kanssa; ( .. ) tarkoittaa alikuorta

  • Tehtävä tehdään ilman välilyöntejä, x = 1920 kutsuu komennon x parametreilla = ja 1920. Käytä sen sijaan x=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:

  1. Älä laita bash -kenttään välilyöntiä = arvojen osoittaminen; esimerkki x=123, ei x = 123.
  2. Voit verrata asioita kohtaan bash, käytä [[ .. ]].
  3. xdotool on jo getwindowgeometry --shell bash ohjelmointi.

kommentit

  • -1 | Sillä olet käyttänyt eval ja ` tarpeettomasti

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *