Я следую этому руководству по использованиюgetopt.
#!/bin/bash
ALPHA=test
BETA=test
CHARLIE=test
DELTA=test
usage()
{
echo "Usage: alphabet [ -a | --alpha ] [ -b | --beta ]
[ -c | --charlie CHARLIE ]
[ -d | --delta DELTA ] filename(s)"
exit 2
}
PARSED_ARGUMENTS=$(getopt -a -n alphabet -o a:b:c:d: --long alpha:,bravo:,charlie:,delta: -- "$@")
VALID_ARGUMENTS=$?
if [ "$VALID_ARGUMENTS" != "0" ]; then
usage
fi
eval set -- "$PARSED_ARGUMENTS"
while :
do
case "$1" in
-a | --alpha) ALPHA="$2" ; shift 2 ;;
-b | --beta) BETA="$2" ; shift 2 ;;
-c | --charlie) CHARLIE="$2" ; shift 2 ;;
-d | --delta) DELTA="$2" ; shift 2 ;;
--) shift; break ;;
*) echo "Unexpected option: $1 - this should not happen."
usage ;;
esac
done
echo "ALPHA : $ALPHA"
echo "BETA : $BETA "
echo "CHARLIE : $CHARLIE"
echo "DELTA : $DELTA"
echo "Parameters remaining are: $@"
Итак, все аргументы являются обязательными. Если мы не указали аргумент, то будет возвращено значение по умолчанию (которое я назначил с самого начала).
БЫВШИЙ:
./script
PARSED_ARGUMENTS is --
ALPHA : unset
BETA : unset
CHARLIE : unset
DELTA : unset
Пример2
./script -a aaa
PARSED_ARGUMENTS is -a 'aaa' --
ALPHA : aaa
BETA : unset
CHARLIE : unset
DELTA : unset
Parameters remaining are:
Пока что всё идеально.
Проблема:
Теперь, если я вызываю аргумент, но не передаю никаких значений при запуске скрипта, то возникает ошибка.
./script -a
alphabet: option requires an argument -- 'a'
Usage: alphabet [ -a | --alpha ] [ -b | --beta ]
[ -c | --charlie CHARLIE ]
[ -d | --delta DELTA ] filename(s)
В этом случае, если я не указал значения, -a
то следует взять значение по умолчанию (с самого начала).
решение1
Вы не можете просто указать «-a» и оставить его без аргумента, вместо этого вы можете вообще не упоминать «-a», а внутри скрипта, если опция -a не указана, вы можете назначить значение по умолчанию, как показано ниже:
if [[ -z $ALPHA ]]
then
ALPHA="defaultvalue"
fi