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
}