Как проверить переданные аргументы, значения и зависимости между аргументами? - PullRequest
0 голосов
/ 29 ноября 2018

Я очень плохо знаком с сценарием оболочки и пишу сценарий, принимая некоторые аргументы от пользователя.Описание этих аргументов приведено в разделе ПОМОЩЬ.Я хочу проверить эти аргументы, переданные пользователем, чтобы он не передавал неверные аргументы.Некоторые из аргументов должны быть в определенном формате, например, 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-01 или kiwi-qx-02 или kiwi-qx-100.Если фрукт является яблоком, пользователь должен передать аргумент username.Если это не яблоко, то пользователь не должен передавать имя пользователя.Дата и время должны иметь определенный формат, как показано в разделе ПОМОЩЬ.Как проверить эти переданные аргументы?Каков наилучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я дам вам небольшой старт:

  • исследование getopts
  • проверка с использованием регулярных выражений

Вот только небольшой примердля аргументов fruit -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

Примечание: я упростил задачу только для трех плодов, и регулярное выражение для datatime также может быть более строгим.

Также обратите внимание, что короткие аргументы могут бытьтолько один символ, поэтому -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
0 голосов
/ 29 ноября 2018

Я знаю, что это не строго говоря проверки, но вы могли бы просто сделать следующее для конкретного ввода параметров:

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

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

Что касается значений:

Это будет зависеть от значенияобсуждаемый.Например: Чтобы проверить, является ли значение URL-адресом:

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

Надеюсь, это поможет

...