Когда скрипт обрастает опциями (-f, -o, -v и т.д.), его удобно превратить в "настоящую CLI-утилиту". Для этого существует встроенный инструмент -
getopts.getopts - это встроенная функция bash для парсинга коротких флагов (-a, -b value) по POSIX-стандарту.📱 Пример: скрипт с флагами
#!/bin/bash
usage() {
echo "Usage: $0 [-f файл] [-v]"
exit 1
}
verbose=0
file=""
while getopts ":f:v" opt; do
case $opt in
f) file="$OPTARG" ;;
v) verbose=1 ;;
\?) echo "Invalid option: -$OPTARG" >&2; usage ;;
🙂 echo "Option -$OPTARG requires an argument." >&2; usage ;;
esac
done
🌟 Как это работает?
getopts ":f:v":
: в начале - включает ручную обработку ошибок.
f: - опция -f ожидает аргумент ($OPTARG).
v - флаг без аргумента.
Внутри case ты обрабатываешь каждый флаг.
Остаток ($@) можно анализировать после shift $((OPTIND - 1)).
🧑💻 Пример запуска:
./myscript.sh -f /tmp/data.txt -v
🌟 Советы:
1. getopts не поддерживает длинные флаги (--file), только короткие (-f). Для более сложных CLI можно использовать getopt (внешняя утилита) или перейти на Python/Go.
2. Не забывай делать usage и проверки на обязательные параметры.
3. Удобно использовать шаблон shift $((OPTIND - 1)) после парсинга, чтобы работать с позиционными аргументами.
⭐️ Мини-шаблон CLI:
#!/bin/bash
while getopts ":u:p:h" opt; do
case $opt in
u) user=$OPTARG ;;
p) pass=$OPTARG ;;
h) echo "Usage: $0 -u user -p pass"; exit 0 ;;
*) echo "Invalid option"; exit 1 ;;
esac
done
BashTex 📱 #bash #utils