Função shell que consome dois argumentos por iteração de loop

2

Eu estou escrevendo alguns scripts iptables, e eu quero escrever uma função que leva um número arbitrário de parâmetros e consome dois de cada vez. Aqui está um exemplo:

#!/bin/sh
# Allow inbound sessions for a specific service
iptables --append INPUT --protocol $PROTO --destination-port $PORT \
   --match state --state NEW --jump ACCEPT || exit 1

Eu encontrei este tópico que mostra a sintaxe certa para um loop através de um número arbitrário de argumentos, mas eu não sei como pegar dois argumentos em cada iteração. Como obtenho os dois $PROTO e $PORT do chamador (de $@ , dois argumentos de cada vez)?

    
por Stobber 22.02.2017 / 21:41

1 resposta

4

Você poderia fazer:

#! /bin/sh -
while [ "$#" -ge 2 ]; do
  proto=$1 port=$2
  shift 2
  iptables --append INPUT --protocol "$proto" --destination-port "$port" \
    --match state --state NEW --jump ACCEPT || exit 1
done

com zsh :

#! /bin/zsh -
for proto port do
  iptables --append INPUT --protocol "$proto" --destination-port "$port" \
    --match state --state NEW --jump ACCEPT || exit 1
done

Uma diferença é que, se houver um número ímpar de argumentos, haverá uma execução extra com $proto contendo o último argumento e $port sendo definido, mas vazio (como se tivéssemos usado [ "$#" -gt 0 ] em vez de [ "$#" -ge 2 ] no exemplo anterior).

    
por 22.02.2017 / 22:05