Mám otázku, jak přidávám argumenty při provádění shell skriptu.
Mám jednoduchý skript, který mi pomáhá blokovat rozsahy IP:
~/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"
Pokud to provedu bez argumentů, výstup je podle očekávání:
~$ ./block_ip.sh usage ~/block_ip.sh (DROP/ACCEPT) "0.0.0.0" "amsterdam"
Mezery se však zdají být příčinou neočekávaný výstup „očekáván binární operátor“ :
~$ ./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
Ale poté jej přidá i přes neočekávaný výstup:
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 1.0.0.0/8 anywhere /* south brisbane au */
Pokud jde o problém s citací, jak vytvořím argumenty (bez použití zpětných lomítek k úniku mezer)? Samozřejmě očekávám, že možná budu potřebovat změnu skriptu, to je také přijatelné řešení.
Komentáře
Odpověď
Ano, to je citace issue: [ ! $3 ]
expanduje na [ ! south brisbane qld ]
(čtyři argumenty mezi [
a ]
). A když vidí čtyři argumenty, s prvním !
, [
očekává, že něco uvidí jako [ ! arg1 op arg2 ]
kde op
je binární operátor. (toto je opět jedna z věcí odlišných mezi [ .. ]
a [[ .. ]]
; viz toto Q a také tento Q )
brisbane
není platný operátor, takže si stěžuje a vrátí 2, což je falešné, takže příkazy uvnitř if
nejsou provedeny. Chcete-li zjistit rozdíl mezi chybou a běžným selhávajícím testem, musíte explicitně otestovat návratovou hodnotu proti 2.
Na druhou stranu, pokud $3
je prázdný, pak se z testu stane [ ! ]
, test s jedním argumentem, který kontroluje, zda je jediný argument neprázdný (je to jednoznakový řetězec !
). V takovém případě to funguje, jak bylo zamýšleno, i když možná ne z důvodu, který byste očekávali.
Chcete [ ! "$3" ]
nebo [ -z "$3" ]
zachovat řetězec jako jeden argument pro [
.
Samozřejmě můžete také invertovat smysl testu a provést skutečná práce uvnitř if
, aby se chyba v testu vyhnula spouštění hlavních příkazů. Tím by ale byla struktura kódu trochu nejasnější.
Komentáře
- pěkné – takže důvod, proč to funguje, je ten, že i když je chyba, $ 3 není ' prázdný, takže projde testem! a pak ho nechám uvést v příkazu
iptables
, takže jeho rozšíření o mezery je již zpracováno – je to tak? - a oni ' Chci také uvést parametry v řádku iptables
- @WEBjuju, ach ano, chtěl jsem o tom psát, upravit, proč to funguje. A ano,měli jste uvozovky v příkazu
iptables
, takže to funguje dobře. - @ilkkachu mám, ano, zdá se mi to hloupé. nějak jsem to věděl podvědomě, ale nemohl jsem ' přivést znalosti k fungujícímu řešení. Nějak jsem se probral bez toho, abych dosud znal tohoto základního nájemce, ale vážně jsem se vyrovnal. moc děkuji!
$3
je jen pro jistotu, že existují tři parametry můžete použít jednodušší$#
proměnnou prostředí, která obsahuje počet parametrů, např.if [ $# -ne 3 ]
.