Bináris operátor várható – idézi a kérdést a shell szkripthez. Args

Kérdésem lenne, hogyan adhatok hozzá argumentumokat egy shell parancsfájl futtatásakor.

Van egy egyszerű szkriptem, amely segít blokkolni az ip tartományokat:

~/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" 

Ha ezt argumentumok nélkül hajtom végre, akkor a kimenet a vártnak felel meg:

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

Úgy tűnik azonban, hogy a szóközök okozzák a “bináris operátor várható” váratlan kimenete:

~$ ./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 

De a váratlan kimenet ellenére hozzáadja:

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

Ha ez idéző kérdés, hogyan formálhatom meg az argumentumokat (anélkül, hogy a szóközök elől visszavonást használnék)? Természetesen azt gondolom, hogy szükségem lehet változtatásra a szkripthez, ez is elfogadható megoldás.

Megjegyzések

  • Ha a célod a $3 csak annak biztosítására szolgál, hogy három paraméter létezik használhatja az egyszerűbb $# shell változót, amely megtartja a paraméterek számát, pl. if [ $# -ne 3 ].

Válasz

Igen, ezt idézem kérdés: [ ! $3 ] kibővül [ ! south brisbane qld ] -re (négy argumentum [ és ). És amikor négy argumentumot lát, az elsővel egy !, [ elvár valamit mint a [ ! arg1 op arg2 ] ahol a op bináris operátor. (ez megint a [ .. ] és [[ .. ]]; lásd ezt a kérdést és ez a Q is )

brisbane nem érvényes operátor, ezért panaszkodik és visszaad 2-t, ami hamis, így a if nem kerül végrehajtásra. Ha különbséget akar tenni egy hiba és egy rendszeresen sikertelen teszt között, akkor kifejezetten tesztelnie kell a visszatérési értéket 2-vel.

Másrészt, ha $3 üres, akkor a teszt [ ! ] lesz, egy argumentumú teszt, amely ellenőrzi, hogy az egyetlen argumentum nem üres-e (ez az egy karakterből álló karakterlánc !). Ebben az esetben rendeltetésszerűen működik, bár talán nem a várt ok miatt.


A következőre vágyik: [ ! "$3" ] vagy [ -z "$3" ], hogy a karakterláncot a [ egyik argumentumaként őrizze meg.

Természetesen megfordíthatja a teszt értelmét is, és elvégezheti a tényleges munka a if belsejében, így a teszt hibája elkerülné a fő parancsok futtatását. Ez azonban kissé homályosabbá tenné a kódszerkezetet.

Megjegyzések

  • kedves – tehát akkor működik, mert hiába hibázik, a 3 dollár nem ' nem üres, így átmegy a! teszten, és utána megadom a iptables parancsban, így a szóközökkel való kibővítése már megoldott – igaz?
  • és ők ' meg akarom idézni az iptables sorban szereplő paramétereket is
  • @WEBjuju, á, igen, erről akartam írni, szerkesztettem, hogy miért működik. És igen,az iptables parancsban voltak idézőjelek, így ott jól működik.
  • @ilkkachu gotcha, igen, ostobának tűnik a végén. valahogy tudat alatt tudtam, de nem tudtam ' hozni az ismereteket működő megoldáshoz. valahogy elrontottam anélkül, hogy eddig ismertem volna ezt az alapbérlőt, de csak komolyan szintet léptem. nagyon köszönöm!

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük