вы можете использовать простой подход и перебирать аргументы, чтобы проверить каждый из них на равенство с заданным параметром (например, -t
).
поместите его в функцию:
has_param() {
local term="$1"
shift
for arg; do
if [[ $arg == "$term" ]]; then
return 0
fi
done
return 1
}
и используйте его как предикат в тестовых выражениях:
if has_param '-t' "$@"; then
echo "yay!"
fi
if ! has_param '-t' "$1" "$2" "$wat"; then
echo "nay..."
fi
если вы хотите отклонить пустые аргументы, добавьте точку выхода вверху тела цикла:
for arg; do
if [[ -z "$arg" ]]; then
return 2
fi
# ...
это очень читабельно и не даст вам ложных срабатываний, как сопоставление с образцом или сопоставление с регулярным выражением.
это также позволит размещать флаги в произвольных позициях, например, вы можете поставить -h
в конец командной строки (не вникая, хорошо это или плохо).
но чем больше я об этом думал, тем больше меня что-то беспокоило.
с функцией вы можете взять любую реализацию (например, getopts
) и использовать ее повторно. правила инкапсуляции!
но даже с командами эта сила может стать недостатком. если вы будете использовать его снова и снова, вы будете каждый раз анализировать все аргументы.
я склоняюсь к повторному использованию, но я должен знать о последствиях. противоположный подход состоял бы в том, чтобы анализировать эти аргументы один раз в верхней части скрипта, как вы опасались, и избегать повторного анализа. чтобы перечислить все параметры).
person
Eliran Malka
schedule
03.06.2019