带有解析参数的 Shell 脚本选项

带有解析参数的 Shell 脚本选项

我有 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

getopt命令用于解析 Bash 脚本中的选项,有一个很好的使用指南这里

您可以设置长选项或短选项,还可以使用:或指定该选项是否具有必需参数或可选参数::

不要将它与getopts只能读取短选项且处理方式略有不同的 bash 内置命令相混淆。

我找到了这个指导两者之间的区别简单而直接。

答案3

最好使用代码生成器,例如阿尔巴什,它将为您生成参数处理代码。还有通用的用于参数解析的 bash 库,但您必须将它们与脚本一起分发,而且它们相当长且复杂。

为什么?

  • 建议使用的答案getopt并不是一个好的选择 - 它对长选项的支持是 GNU 扩展,因此使用它的脚本不可移植。getopt除此之外,Plus 还存在自己的问题。
  • 建议编写参数解析代码的答案bash也存在问题——维护像这样相对较长的手写代码感觉不对。

最后,以破折号开头的参数通常称为选修的并按此处理 - 它们不应是必需的,如果省略它们,则应提供合理的默认值。因此,您不满意的原始脚本实际上可能是最佳解决方案。

相关内容