如何验证传递的参数,值和参数之间的依赖关系?

时间:2018-11-29 16:39:53

标签: linux bash shell sh

我对Shell脚本非常陌生,我正在编写一个脚本,它接受了用户的一些参数。这些参数的说明在“帮助”部分中给出。我想验证用户传递的这些参数,以便他不会传递错误的参数。例如,某些参数必须采用某些格式,例如datetime。 -

    #!/bin/bash
    set -u
    set -o pipefail

    exit_status=0
    FRUIT=fruit
    CERT_PATH=cert
    KEY_PATH=key
    USERNAME=username
    DATETIME=datetime

    die() {
        printf '%s\n' "$1" >&2
        exit 1
    }

    show_help() {
        cat << EOF


        HELP:
        ==========================================================================================================================

        Description:

            --fruit or -f:          fruit name: mango, strawberry, grapes, apple, kiwiXX
            --cert or -c            cert
            --key or -k             key
            --username or -un       username to be passed when fruit is apple
            --datetime or -dt       datetime format: 2018-11-07 10:02:01

            --help or -h:           help for <cmd>

        ==========================================================================================================================

    EOF
        exit "$exit_status"
    }

        set_arguments () {
            while [ $# != 0 ]; do

                 case "${1:-}" in
                      -h|-\?|--help)
                          show_help    # Display a usage synopsis.
                          exit
                          ;;
                      -f|--fruit)
                          FRUIT="${2:-}"
                          shift
                          ;;
                      -c|--cert)
                          CERT_PATH="${2:-}"
                          shift
                          ;;
                      -k|--key)
                          KEY_PATH="${2:-}"
                          shift
                          ;;
                      -un|--username)
                          USERNAME="${2:-}"
                          shift
                          ;;
                      -dt|--datetime)
                          DATETIME="${2:-}"
                          fi
                          shift
                          ;;
                      -?*)
                          show_help
                          exit 1
                          ;;
                        *)
                          die 'ERROR: unknown argument.'
                          ;;
                 esac
                 shift
            done
}

# get the incoming arguments and set the variables.
set_arguments "$@"

--fruit参数不能为mango, strawberry, grapes, apple, or kiwi-qx-XX以外的任何其他值。如果为kiwi,则必须包含-qx- and a number。例如:kiwi-qx-01kiwi-qx-02kiwi-qx-100。如果水果是苹果,则用户必须传递参数username。如果不是苹果,则用户不得传递用户名。日期时间应具有特定的格式,如“帮助”部分所示。如何验证这些传递的参数?最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

我知道这并不是严格意义上的验证,但是您可以简单地对特定的参数输入执行以下操作:

case "$1" in
      valueneeded)
      #do something
      ;;

      *)
        clear
        explain what the accepted input is
        exit 1
esac

关于值:

这取决于所讨论的值。例如: 为了检查该值是否为网址:

regexdom='(https?|http|)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
if ! [[ $1 =~ $regexdom ]]
then
    echo "Url introduced is invalid exiting srcipt..."
    exit 1
fi

用您需要完成的正则表达式代替正则表达式。 您可以使用https://regex101.com/对脚本中的正则表达式之前的实现进行现场测试。

此外,看到可能的参数数量,也许最好考虑切换到getopts:

while getopts ":a" opt; do
  case $opt in
    a)
      echo "-a was triggered!" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done

希望这会有所帮助

答案 1 :(得分:1)

我会给你一点开始:

  • 研究getopts
  • 使用正则表达式验证

这里仅是参数-f和datatime -d的小示例:

#!/bin/bash
while getopts f:d: arg
do
  case ${arg} in
    f)
      if [[ "${OPTARG}" =~ "^apple$|^mango$|^kiwi-qx-[0-9]+$" ]]
      then
        echo "fruit OK"
      else
        echo "fruit KO"
      fi
      ;;
    d)
      if [[ "${OPTARG}" =~ "^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$" ]]
      then
        echo "datetime OK"
      else
        echo "datetime KO"
      fi
      ;;
  esac
done
exit 0

注意:我简化了任务,仅针对三个结果,数据时间正则表达式也可以更严格。

还要注意,短参数只能是一个字符,这就是-d的原因。

测试:

$ ./args.sh -f kiwi-qx-100 -d "2018-11-07 10:02:01"
fruit OK
datetime OK

$ ./args.sh -f pear -d "2018-07 10:02"
fruit KO
datetime KO