我有一个bash脚本,我用三个参数调用相同的函数七次,但参数每次都不同:
snmpset_f 16 i 6
snmpset_f 16 i 5
snmpset_f 15 s "ping_test"
snmpset_f 2 i 1
snmpset_f 3 d "192 168 1 2"
snmpset_f 4 i 1
snmpset_f 5 i 64
我发现它有点难看和笨重。如果snmpset_f
函数只有一个参数,我只会for arg in 16 16 15 2 3 4 5; do snmpset_f "$arg"; done
。但是,它有三个。 for arg in "16 i 6" "16 i 5" ...
也不起作用,因为所有三个参数都被传递给一个函数。有没有办法优化这个脚本并使用多个参数循环一个函数?
答案 0 :(得分:1)
如果不是"192 168 1 2"
,你可以依赖shell的分词
for arg in "16 i 6" "16 i 5"; do
snmpset_f $arg
done
bash
数组也不是第一类对象,或者你可以做类似
for arg in (16 i 6) (3 d "192 168 1 2"); do
但是,如果只有 3rd 参数可能包含空格,您可以尝试从这里读取文档:
while read -r arg1 arg2 arg3; do
snmpset_f "$arg1" "$arg2" "$arg3"
done <<EOF
16 i 6
16 i 5
15 s ping_test
2 i 1
3 d 192 168 1 2
4 i 1
5 i 64
EOF
请注意,对于寻找IP地址的参数,不需要引号,因为read
仅拆分前两个空格实例上的行;其他一切都按原样进入第三个论点。
答案 1 :(得分:1)
您没有显示实际的功能代码,因此您必须根据需要进行调整。您可以使用positional parameters,parameter expansion和shift命令通过将参数分块来解决此问题。
基本上,诀窍是使用 snmpset_f_args 的长度将块中的参数传递给函数,直到用完顶级位置参数。例如:
snmpset_f () {
# Loop over the parameters passed to this function.
for arg in "$@"; do
echo -n "$arg "
done
echo
}
# Explicitly set your positional parameters if necessary.
set -- 16 16 15 2 3 4 5
# Define how many arguments at a time to process.
snmpset_f_args=3
# Call the function until we run out of parameters.
while [[ $# -ne 0 ]]; do
snmpset_f "${@:1:$snmpset_f_args}"
# You have to shift one at a time in a loop, because shift won't
# shift if invoked with more parameters than you have.
for arg in $(seq 1 $snmpset_f_args); do
shift
done
done
根据帖子中的数据设置,上面的代码会将以下内容打印到标准输出:
16 16 15
2 3 4
5