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
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!
$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 ]
.