如何在bash中为getopts提供大量参数?

时间:2013-04-28 07:28:41

标签: bash

我正在寻找一个配方来提供空格分隔的IP地址列表作为bash脚本的命名可选参数。我想获得下一个功能:

./bootstrap.sh -bx -c 192.168.1.1 192.168.1.2

此处bx是一些可选参数,-c应该获取IP地址列表作为参数。我使用getops来处理参数,现在我以逗号分隔的字符串提供此参数:

./bootstrap.sh -bx -c192.168.1.1,192.168.1.2

效果很好,但对用户来说看起来很丑陋且不直观。 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:6)

绝对是约翰所说的。 getopts会多次触发选项,因此如果您想要使用第二种语法

./bootstrap.sh -bx -c 192.168.1.1 -c 192.168.1.2

它很容易实现 - 只需将-c参数推送到数组上进行进一步处理,例如:

#!/bin/bash

b=0
x=0
c=()

while getopts ":bxc:" o; do
        case "${o}" in
                b) b=1 ;;
                x) x=1 ;;
                c) c+=( "${OPTARG}" ) ;;
                *) echo "usage()"; exit 1 ;;
        esac
done
shift $((OPTIND-1))

echo "b = ${b}"
echo "x = ${x}"
if (( ${#c} > 0 )); then
        for ip in "${c[@]}"; do
                ips="${ips}${ip}, "
        done
        echo "IPs = ${ips%??}"
fi
if (( $# > 0 )); then
        echo "non-option arguments: $*"
fi

示例:

$  ./test.sh foo bar quux
b = 0
x = 0
non-option arguments: foo bar quux

$  ./test.sh -bx -c 192.168.1.1 -c 192.168.1.2 foo bar quux
b = 1
x = 1
IPs = 192.168.1.1, 192.168.1.2
non-option arguments: foo bar quux

答案 1 :(得分:5)

您应该考虑选择两种规范的Unix命令行语法:

./bootstrap.sh -bx 192.168.1.1 192.168.1.2

也就是说,-b和-x都不接受参数,脚本将IP地址作为位置参数(尽可能多)。

或者:

./bootstrap.sh -bx -c 192.168.1.1 -c 192.168.1.2

也就是说,-c接受一个参数,它可以多次使用。这是非常传统的,在你说它很丑或重复之前,请注意Bash或类似的shell会允许你使用一个与你最初建议的非常相似的速记:

./bootstrap.sh -bx -c={192.168.1.1,192.168.1.2}

shell将扩展它,使实际调用与前面的示例相同。因此,如果你假设带参数的常规-c选项,你的shell将支持上述“免费”。

请抵制发明新语法的诱惑,例如“-g foo,bar”,您可以用某种应用程序指定的方式解析参数。这种方法不太适合与xargs等标准Unix工具集成。