Вы можете воспользоваться простым подходом и перебрать аргументы, чтобы проверить каждый из них на равенство с заданным параметром (например, -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
) и использовать ее повторно.инкапсуляция rulez!
но даже с командами эта сила может стать недостатком.если вы будете использовать его снова и снова, вы будете анализировать все аргументы каждый раз.
Моя тенденция состоит в том, чтобы поддерживать повторное использование, но я должен знать о последствиях.противоположный подход заключается в том, чтобы проанализировать эти аргументы один раз в начале скрипта, как вы и боялись, и избежать повторного анализа.
вы все равно можете инкапсулировать этот регистр переключателя, который может быть настолько большим, насколько вы решили (у вас нетк списку все опций).