Jeg har et spørgsmål om, hvordan jeg tilføjer argumenter, når jeg udfører et shell-script.
Jeg har et simpelt script, der hjælper mig med at blokere ip-intervaller:
~/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"
Hvis jeg udfører dette uden argumenter, er output som forventet:
~$ ./block_ip.sh usage ~/block_ip.sh (DROP/ACCEPT) "0.0.0.0" "amsterdam"
Imidlertid synes mellemrummene at være årsagen til uventet output fra “forventet binær operatør” :
~$ ./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
Men så tilføjer det det på trods af det uventede output:
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 1.0.0.0/8 anywhere /* south brisbane au */
Hvis dette er et citatproblem, hvordan danner jeg argumenterne (uden at bruge tilbageslag for at undslippe mellemrummet)? Selvfølgelig forventer jeg muligvis en ændring til scriptet, er det også en acceptabel løsning.
Kommentarer
Svar
Ja, det er et citat problem: [ ! $3 ]
udvides til [ ! south brisbane qld ]
(fire argumenter mellem [
og ]
). Og når den ser fire argumenter, med den første forventer en !
, [
at se noget som [ ! arg1 op arg2 ]
hvor op
er en binær operatør. (dette er igen en af de ting, der er forskellige mellem [ .. ]
og [[ .. ]]
; se denne Q og også denne Q )
brisbane
er ikke en gyldig operator, så den klager og returnerer 2, hvilket er falsk, så udsagnene inde i if
udføres ikke. For at fortælle forskellen mellem en fejl og en regelmæssig fejlagtig test skal du eksplicit teste returværdien mod 2.
På den anden side, hvis $3
er tom, så bliver testen til [ ! ]
, en test med et argument, der kontrollerer, om det eneste argument ikke er frit (det er, det er entegnsstrengen !
). I så fald fungerer det som beregnet, men måske ikke af den grund, du forventer.
Du vil have [ ! "$3" ]
eller [ -z "$3" ]
for at beholde strengen som et argument for [
.
Du kunne selvfølgelig også vende testens mening og gøre faktisk arbejde inde i if
, så en fejl i testen undgår at køre hovedkommandoerne. Men det ville gøre kodestrukturen lidt mere uklar.
Kommentarer
- pænt – så grunden til, at det fungerer, er, at selvom det fejler, er $ 3 ikke ' t tomt, så det består! -testen, og så har jeg den citeret i
iptables
-kommandoen, så dens udvidelse til at omfatte mellemrum håndteres allerede – er det rigtigt? - og de ' Jeg vil også citere parametrene i iptables-linjen
- @WEBjuju, ah ja, jeg mente at skrive om det, redigeret hvorfor det fungerer. Og ja,du havde citaterne i kommandoen
iptables
, så der fungerer det fint. - @ilkkachu gotcha, ja, det virker fjollet i min ende. på en eller anden måde vidste jeg det ubevidst, men kunne ikke ' ikke frembringe viden til en fungerende løsning. Jeg har på en eller anden måde rodet igennem uden at kende denne grundlæggende lejer indtil nu, men jeg rettede mig lige op. meget tak!
$3
er bare for at være sikker på, at der er tre parametre, så du kan bruge den enklere$#
shellvariabel, som indeholder antallet af parametre, f.eks.if [ $# -ne 3 ]
.