对于bash命令行参数验证库(Command line argument validation li

2019-07-30 03:48发布

我要寻找一个可重用的代码片段,做的命令行参数验证了庆典。

理想的情况是一个类似于由Apache的百科全书CLI提供的功能:

共享CLI支持不同类型的选项:

  • POSIX类似的选项(即焦油-zxvf的foo.tar.gz)
  • GNU像长选项(即杜--human可读--max深度= 1)
  • 短选项附值(即GCC -O2 foo.c的)
  • 长选项用连字符(即蚂蚁-projecthelp)
  • ...

并自动生成用于该程序的“使用”的消息,这样的:

usage: ls
 -A,--almost-all          do not list implied . and ..
 -a,--all                 do not hide entries starting with .
 -B,--ignore-backups      do not list implied entried ending with ~
 -b,--escape              print octal escapes for nongraphic characters
    --block-size <SIZE>   use SIZE-byte blocks
 -c                       with -lt: sort by, and show, ctime (time of last
                          modification of file status information) with
                          -l:show ctime and sort by name otherwise: sort
                          by ctime
 -C                       list entries by columns

我想包括我的Bash脚本的开头此代码段和整个​​脚本重复使用它。

必须有这样的事情。 我不相信我们都编写代码来这种效果或类似:

#!/bin/bash

NUMBER_OF_REQUIRED_COMMAND_LINE_ARGUMENTS=3

number_of_supplied_command_line_arguments=$#

function show_command_usage() {
  echo usage:
  (...)
}

if (( number_of_supplied_command_line_arguments < NUMBER_OF_REQUIRED_COMMAND_LINE_ARGUMENTS )); then
  show_command_usage
  exit
fi

...

Answer 1:

这是我使用的解决方案(发现它在网络上的某个地方,也许在这里本身,不记得是肯定的)。 请注意,GNU getopt的( /usr/bin/getopt )不支持单破折号长选项( ant -projecthelp使用选项风格) -a ,但是我没有那么它是不是在示例所示用它。

此代码解析为3个选项: --host value-h value--port value-p value--table value-t value 。 在情况下所需的参数没有被设置,因为它的测试是

# Get and parse options using /usr/bin/getopt
OPTIONS=$(getopt -o h:p:t: --long host:,port:,table: -n "$0" -- "$@")
# Note the quotes around `$OPTIONS': they are essential for handling spaces in 
# option values!
eval set -- "$OPTIONS"

while true ; do
    case "$1" in
            -h|--host) HOST=$2 ; shift 2 ;;
            -t|--table)TABLE=$2 ; shift 2 ;;
            -p|--port)
                    case "$2" in
                            "") PORT=1313; shift 2 ;;
                            *)  PORT=$2; shift 2 ;;
                    esac;;
            --) shift ; break ;;
            *) echo "Internal error!" ; exit 1 ;;
    esac
done
if [[ -z "$HOST" ]] || [[-z "$TABLE" ]] || [[ -z "$PORT" ]] ; then
    usage()
    exit
if

使用替代实现getopts shell内置(这个只支持小选项):

while getopts ":h:p:t:" option; do
    case "$option" in
         h) HOST=$OPTARG ;;
         p) PORT=$OPTARG ;;
         t) TABLE=$OPTARG ;;
        *) usage(); exit 1 ;;
    esac
done
if [[ -z "$HOST" ]] || [[-z "$TABLE" ]] || [[ -z "$PORT" ]] ; then
    usage()
    exit
if

shift $((OPTIND - 1))

进一步阅读GNU的getopt和getopts的BASH内置



文章来源: Command line argument validation library for Bash
标签: bash shell