Shell: установить необязательный аргумент или использовать значение по умолчанию с помощью getopts?

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

sh name.sh -l -a
sh name.sh -l

Это код, который у меня есть до сих пор, используя getopts, где -a является обязательным аргументом:

default="no"

echo "Initial parameters. 

while getopts ":l:a:" o; do
    case "${o}" in
        l)
            ...;;
        a)
            a+=(${OPTARG})
            IFS=',' read -a myarray <<< "$a"
            default="yes"
            ;;
        :)
            echo "Missing option argument for -$OPTARG" >&2; exit 1;;
        *)
            usage;;
    esac
done
shift $((OPTIND-1))

if [ -z "${l}" ] || [ -z "${a}" ] ; then
    usage
fi

Мне просто нужно знать, как установить в getopts необязательный флаг -a с его аргументом. Спасибо:)


person Momina    schedule 03.09.2016    source источник
comment
Возможный дубликат Аргумент необязательной опции с getopts   -  person qzb    schedule 03.09.2016
comment
@qzb нет, я использую getopts и не хочу без него обходиться.   -  person Momina    schedule 03.09.2016


Ответы (1)


Насколько я знаю, getopts не поддерживает необязательные параметры-аргументы. Вы можете обойти это, обработав option-argument самостоятельно:

#!/bin/bash

while getopts "x" o; do
  case "${o}" in
    x)
      OPTARG=${!OPTIND}

      if [ "${OPTARG:0:1}" == "-" ] || [ "$#" -lt "$OPTIND" ]; then
        OPTARG="DEFAULT"
      else
        OPTIND=$(( $OPTIND + 1 ))
      fi

      echo $OPTARG
      ;;
  esac
done
person qzb    schedule 08.09.2016