getopts со всеми необязательными аргументами

Для запуска bash-скрипта мне нужны некоторые аргументы и флаги, так как требования довольно сложны, я решил использовать такую ​​функцию getopt, как эта

while getopts ":s:g:r" o; do
    case "${o}" in
        s)
        # Variables that require value            
        VALUE1=${OPTARG}
        ;;
        g)
        # Variables that require value
        MGROUP=${OPTARG}
        ;;
        r)
        # Variables that, if present, set just a flag
        ASROOT=1
        ;;
        *)
        echo "Usage: ./myscript.sh -s value1 -g value2 -r"
        ;;
    esac
done

Я хотел бы, чтобы все параметры были необязательными, чтобы я мог написать некоторые условия позже в моем коде, и первые два (s и g) с аргументами, третий (r) - это только необязательный флаг. В будущем мне может понадобиться добавить дополнительные параметры, всегда необязательные. Любой совет?

1 ответ

Пример сценария, иллюстрирующий необязательные аргументы с помощью getopts bash в стиле, аналогичном клиенту mysql. "-" также поддерживается.

Использование: script.sh [-u ] [-p | -p] [-] arg1 arg2 ...

#!/bin/bash
#
# Sample script illustrating optional arguments with bash getopts in
#   a style similar to mysql client.  "--" is also supported.
#
# tgage@nobigfoot.com - 5-Oct-2019 - Distribute/use without restriction.
#

# Defaults
username="$(whoami)"
unset password

while getopts ":u:p:" arg; do
  case $arg in
      u)  # Username
      username="$OPTARG"
      ;;
      p)  # Password
      thisarg=$((OPTIND - 1)); thisarg="${!thisarg}"; thisarg="${thisarg:2}"

      if [[ ! -z $OPTARG ]] && [[ "$OPTARG" != "$thisarg" ]]; then
          unset password
          OPTIND=$((OPTIND - 1))
      else
          password="$thisarg"
      fi
      if [[ -z $password ]]; then
          read -s -p "Password: " password
          echo
      fi
      ;;
      \?)
      # Request Help
      echo "Sorry that I can be of no help."
      ;;
      *)
      # Deal with option at end of line
      OPTION=$((OPTIND - 1)); OPTION="${!OPTION}"
      case $OPTION in
          --)
          # Add support for --
          break
          ;;
          -p)
          # Option with optional argument
          unset password
          read -s -p "Password: " password
          echo
          ;;
          *)
          # Invalid argument
          echo "Error; Invalid option \"$OPT\"." >&2
          ;;
      esac
      ;;
  esac
done
shift $((OPTIND -1))

echo "Username: $username"
echo "Password: $password"
echo
echo "Remaining arguments:$*"
echo

Необязательный параметр необязателен для обязательной проверки. VALUE1 а также MGROUP, Например:

[[ -n $VALUE1 && -n $MGROUP ]] || {
    echo "mandatory paramter missing"
    exit 1
}

getopts

Другие вопросы по тегам