Binaire operator verwacht – vraag aanhalen voor shellscript args

Ik heb een vraag over hoe ik “argumenten toevoeg bij het uitvoeren van een shellscript.

Ik heb een eenvoudig script waarmee ik IP-bereiken kan blokkeren:

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

Als ik dit zonder argumenten uitvoer, is de uitvoer zoals verwacht:

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

De spaties lijken echter de oorzaak te zijn van de onverwachte uitvoer van “binaire operator verwacht” :

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

Maar dan wordt het toegevoegd ondanks de onverwachte uitvoer:

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

Als dit een citaatprobleem is, hoe vorm ik dan de argumenten (zonder backslashes te gebruiken om aan de spaties te ontsnappen)? Natuurlijk verwacht ik dat ik misschien een wijziging nodig heb naar het script, dat is ook een acceptabele oplossing.

Opmerkingen

  • Als uw doel bij het testen $3 is om er zeker van te zijn dat er drie parameters zijn je kunt de eenvoudigere $# shell-variabele gebruiken, die het aantal parameters bevat, bijv. if [ $# -ne 3 ].

Antwoord

Ja, dat is een citaat probleem: [ ! $3 ] breidt uit naar [ ! south brisbane qld ] (vier argumenten tussen [ en ]). En wanneer het vier argumenten ziet, met de eerste een !, verwacht [ iets te zien zoals [ ! arg1 op arg2 ] waarbij op een binaire operator is. (dit is wederom een van de dingen die verschillen tussen [ .. ] en [[ .. ]]; zie deze Q en ook deze Q )

brisbane is geen geldige operator, dus het klaagt en retourneert 2, wat vals is, zodat de instructies in de if worden niet uitgevoerd. Om het verschil te zien tussen een fout en een normale falende test, “zou je de geretourneerde waarde expliciet moeten testen tegen 2.

Aan de andere kant, if $3 leeg is, dan wordt de test [ ! ], een test met één argument die controleert of het enige argument niet leeg is (het is, het is de tekenreeks van één teken !). In dat geval werkt het zoals bedoeld, maar misschien niet om de reden die u “verwacht.


U wilt [ ! "$3" ] of [ -z "$3" ] om de string als één argument te behouden voor [.

Je kunt natuurlijk ook de betekenis van de test omkeren en de feitelijk werk binnen de if, zodat een fout in de test het uitvoeren van de hoofdcommandos zou voorkomen. Maar dat zou de codestructuur een beetje onduidelijker maken.

Opmerkingen

  • leuk – dus de reden dat het dan werkt is dat, hoewel het een fout maakt, $ 3 niet ' t leeg is, dus slaagt voor de! -test en dan laat ik het citeren in het iptables -commando, dus de uitbreiding met spaties wordt al afgehandeld – klopt dat?
  • en zij ' Ik wil ook de parameters in de iptables-regel citeren.
  • @WEBjuju, ah ja, ik wilde daarover schrijven, heb bewerkt waarom het werkt. En ja,je had de aanhalingstekens in het iptables commando, dus daar werkt het prima.
  • @ilkkachu gotcha, ja, het lijkt dom aan mijn kant. op de een of andere manier wist ik het onbewust, maar kon ' niet de kennis naar een werkende oplossing brengen. ik heb op de een of andere manier doormodderen zonder deze basishuurder tot nu toe te kennen, maar ik ben gewoon serieus naar een hoger niveau getild. veel dank!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *