每次循环迭代消耗两个参数的 Shell 函数

每次循环迭代消耗两个参数的 Shell 函数

我正在编写一些 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 ]

相关内容