我正在寻找一个配方来提供空格分隔的IP地址列表作为bash脚本的命名可选参数。我想获得下一个功能:
./bootstrap.sh -bx -c 192.168.1.1 192.168.1.2
此处b
和x
是一些可选参数,-c
应该获取IP地址列表作为参数。我使用getops
来处理参数,现在我以逗号分隔的字符串提供此参数:
./bootstrap.sh -bx -c192.168.1.1,192.168.1.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工具集成。