Binaarinen operaattori odotettavissa – lainaamalla kysymys komentosarjakomentojen argumenteille

Minulla on kysymys siitä, kuinka lisätään argumentteja suoritettaessa komentosarjakomentosarjaa.

Minulla on yksinkertainen komentosarja, joka auttaa estämään ip-alueet:

~/block_ip.sh:

if [ ! $3 ] then echo "usage ~/block_ip.sh (DROP/ACCEPT) "0.0.0.0" "amsterdam"" exit 1 fi echo "adding $3" sudo iptables -I INPUT -s $2 -j $1 -m comment --comment "$3" 

Jos suoritan tämän ilman argumentteja, tulos on odotettua:

~$ ./block_ip.sh usage ~/block_ip.sh (DROP/ACCEPT) "0.0.0.0" "amsterdam" 

Välilyönnit näyttävät kuitenkin aiheuttavan odottamaton ”odotettu binäärioperaattori” -lähtö:

~$ ./block_ip.sh DROP "1.0.0.0/8" "south brisbane qld" ./block_ip.sh: line 1: [: brisbane: binary operator expected adding south brisbane au 

Mutta sitten se lisää sen odottamattomasta tuloksesta huolimatta:

Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 1.0.0.0/8 anywhere /* south brisbane au */ 

Jos tämä on lainausongelma, miten voin muodostaa argumentit (ilman väliviivojen poistamista välilyönneistä)? Tietysti luulen tarvitsevani muutoksia komentosarjaan, se on myös hyväksyttävä ratkaisu.

Kommentit

  • Jos tavoitteesi testataan $3 on vain varma, että on olemassa kolme parametria voit käyttää yksinkertaisempaa $# -muuttujaa, joka sisältää parametrien määrän, esim. if [ $# -ne 3 ].

Vastaa

Jep, se ”lainaa” ongelma: [ ! $3 ] laajenee muotoon [ ! south brisbane qld ] (neljä argumenttia [ ja ). Ja kun se näkee neljä argumenttia, ensimmäisen kanssa !, [ odottaa näkevänsä jotain kuten [ ! arg1 op arg2 ] missä op on binaarinen operaattori. (tämä on jälleen yksi asia, joka eroaa [ .. ] ja [[ .. ]]; katso tämä kysymys ja myös tämä Q )

brisbane ei ole kelvollinen operaattori, joten se valitsee ja palauttaa arvon 2, mikä on väärä, joten lausekkeet if ei suoriteta. Virheen ja tavallisen epäonnistuneen testin välisen eron selvittämiseksi sinun on testattava nimenomaisesti palautusarvo 2: n kanssa.

Toisaalta, jos $3 on tyhjä, sitten testistä tulee [ ! ], yhden argumentin testi, joka tarkistaa, onko ainoa argumentti tyhjä (se on yhden merkin merkkijono !). Siinä tapauksessa se toimii tarkoitetulla tavalla, vaikkakaan ehkä syystä, jota odotit.


Haluat [ ! "$3" ] tai [ -z "$3" ], jotta merkkijono säilyy yhtenä argumenttina [ -elementille.

Voit tietysti myös kääntää testin merkityksen ja tehdä varsinainen työ if sisällä, jotta testivirhe välttäisi pääkomentojen suorittamisen. Se tekisi kuitenkin koodirakenteesta hieman epäselvämmän.

Kommentit

  • kiva – joten syy siihen silloin on, että vaikka virhe, $ 3 ei ' ole tyhjä, joten se läpäisee! -testin ja saan sen lainata komentoon iptables, joten sen laajentaminen välilyönteihin hoidetaan jo – onko niin?
  • ja he ' Haluan lainata myös iptables-rivin parametrit
  • @WEBjuju, ah kyllä, tarkoitin kirjoittaa siitä, muokkain miksi se toimii. Ja kyllä,sinulla oli lainauksia iptables -komennossa, joten se toimii hyvin.
  • @ilkkachu gotcha, kyllä, se näyttää typerältä päältäni. jotenkin tiesin sen alitajuisesti, mutta en voinut ' tuoda tietoa toimivaan ratkaisuun. olen jotenkin sekoittanut tuntematta tätä perusvuokralaista tähän asti, mutta tasoittuin vain vakavasti. paljon kiitoksia!

Vastaa

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