Očekává se binární operátor – citace otázky pro shell skript args

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

  • Pokud je vaším cílem testování $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 ].

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!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *