我有 shell 脚本
CONTROLLER_IP=""
if [ "$#" -eq 1 ]
then
CONTROLLER_IP=$1
else
echo "Usage : create_endpoint.sh --controller-ip <Controller IP>"
exit 1
fi
但其执行情况如下。/create_endpoint.sh 10.10.10.1
我想这样执行/create_endpoint.sh --controller-ip 10.10.10.1
答案1
像这样:
#!/bin/bash
CONTROLLER_IP=""
while [ "$1" != "" ]; do
case $1 in
-c|--controller-ip)
if [ -n "$2" ]; then
CONTROLLER_IP="$2"
shift 2
continue
else
echo "ERROR: '--controller-ip' requires a non-empty option argument."
exit 1
fi
;;
-h|-\?|--help)
echo "Usage: $(basename $0) --controller-ip <ip>"
exit
;;
--) # End of all options.
shift
break
;;
-?*)
echo "WARN: Unknown option (ignored): $1"
;;
*) # Default case: If no more options then break out of the loop.
break
esac
shift
done
echo "$CONTROLLER_IP"
例子
$ ./foo --controller-ip 192.168.2.1
192.168.2.1
$ ./foo -c 192.168.2.1
192.168.2.1
$ ./foo --controller-ip
ERROR: '--controller-ip' requires a non-empty option argument.
$ ./foo --help
Usage: foo --controller-ip <ip>
$ ./foo -help
WARN: Unknown option (ignored): -help
正如OP评论的那样:
我不想要帮助选项。
#!/bin/bash
CONTROLLER_IP=""
while [ "$1" != "" ]; do
case $1 in
-c|--controller-ip)
if [ -n "$2" ]; then
CONTROLLER_IP=$2
shift 2
continue
else
echo "ERROR: '--controller-ip' requires a non-empty option argument."
exit 1
fi
;;
--) # End of all options.
shift
break
;;
-?*)
echo "WARN: Unknown option (ignored): $1"
;;
*) # Default case: If no more options then break out of the loop.
break
esac
shift
done
echo "$CONTROLLER_IP"
答案2
答案3
最好使用代码生成器,例如阿尔巴什,它将为您生成参数处理代码。还有通用的用于参数解析的 bash 库,但您必须将它们与脚本一起分发,而且它们相当长且复杂。
为什么?
- 建议使用的答案
getopt
并不是一个好的选择 - 它对长选项的支持是 GNU 扩展,因此使用它的脚本不可移植。getopt
除此之外,Plus 还存在自己的问题。 - 建议编写参数解析代码的答案
bash
也存在问题——维护像这样相对较长的手写代码感觉不对。
最后,以破折号开头的参数通常称为选修的并按此处理 - 它们不应是必需的,如果省略它们,则应提供合理的默认值。因此,您不满意的原始脚本实际上可能是最佳解决方案。