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