각 루프 반복에 대해 두 개의 매개변수를 사용하는 셸 함수

각 루프 반복에 대해 두 개의 매개변수를 사용하는 셸 함수

저는 iptables 스크립트를 작성 중이고 임의 개수의 인수를 취하여 한 번에 두 개씩 사용하는 함수를 작성하고 싶습니다. 예는 다음과 같습니다.

#!/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

내가 찾은이 스레드이것은 임의 개수의 매개변수를 반복하는 올바른 구문을 보여 주지만 각 반복에서 두 개의 매개변수를 얻는 방법을 모르겠습니다. 호출자로부터 합계(한 번에 두 개의 인수)를 얻으려면 어떻게 해야 합니까 $PROTO?$PORT$@

답변1

다음을 수행할 수 있습니다.

#! /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

그리고 zsh:

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

한 가지 차이점은 홀수 개의 인수가 있는 경우 $proto마지막 인수가 포함되고 비어 있는 상태로 추가 실행이 발생한다는 것입니다( $port이전 예제에서 [ "$#" -gt 0 ]대신 사용한 것처럼).[ "$#" -ge 2 ]

관련 정보