各ループ反復に対して2つのパラメータを使用するシェル関数

各ループ反復に対して2つのパラメータを使用するシェル関数

私はiptablesスクリプトを書いており、任意の数の引数を取り、一度に2つずつ使用する関数を作成したいと思います。例は次のとおりです。

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

私が見つけたこのスレッドこれは任意の数のパラメータを繰り返す正しい構文を示していますが、各反復で2つのパラメータを取得する方法はわかりません。呼び出し元から合計(一度に2つの引数)を取得するにはどうすればよいですか$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

1つの違いは、奇数の引数がある場合は$proto最後の引数が含まれ、空の状態で追加の実行が発生することです($port前の例で[ "$#" -gt 0 ]代わりに使用したように)。[ "$#" -ge 2 ]

おすすめ記事