BashMaster
7.95K subscribers
667 photos
14 videos
1 file
691 links
Удобные консольные наработки на каждый день для разработчиков, девопсов и сисадминов.

Реклама: @Kone4noVasya

Канал на бирже: https://telega.in/c/bash_help
Download Telegram
Приглашаем на урок по работе с чувствительными данными в Kubernetes-кластере!

Открытый урок «K8S + Vault — как получать секреты?»
Бесплатно 17 июня в 20:00 МСК. 

Поймете, как организовать безопасное и масштабируемое взаимодействие между Kubernetes и HashiCorp Vault. Разберём подход dynamic secrets и инструмент External Secrets Operator для интеграции секретов из Vault в кластер.

На уроке вы узнаете:
- как Kubernetes работает с секретами по умолчанию и его ограничения;
- способы интеграции Kubernetes и Vault;
- что такое External Secrets Operator и почему его выбирают для production-сред;
- пошаговую схему подключения Vault к K8s.

➡️ Регистрация на вебинар

Урок в рамках старта курса «Инфраструктурная платформа на основе Kubernetes», ты можешь воспользоваться 🎁 бонусным промокодом Kuber_06 при покупке курса. 

#реклама
О рекламодателе
⚙️ getopts: как писать CLI-утилиты с флагами без внешних библиотек

✔️getopts — это встроенный в любой POSIX-совместимый Linux/Unix-shell мини-парсер аргументов. Один shebang — и у вас CLI-утилита без единой внешней зависимости. В статье рассмотрим, как выжать из getopts максимум, где он спотыкается и когда пора переехать на getopt или Argbash.

➡️ Почему вообще всё ещё getopts
💠Входит в POSIX — доступен в /bin/sh на любом «живом» юниксе.
💠Никаких зависимостей — скрипт останется единственным файлом.
💠Поведение чётко регламентировано спецификацией Open Group — т. е. скрипт будет вести себя одинаково под bash, zsh, dash, ksh.

▶️Минус — лишь короткие флаги и отсутствие родной поддержки --long-option. Но и это решаемо.

➡️ Базовый синтаксис: одно кольцо, чтобы править всеми
#!/usr/bin/env sh
set -euo pipefail
IFS='
'

usage() {
cat <<EOF
Usage: ${0##*/} [-a] [-b ARG] file...
-a : включить дополнительный режим
-b ARG : передать аргумент
EOF
exit 2
}

# двоеточие в начале → тихий режим ошибок
while getopts ":ab:" opt; do
case "$opt" in
a) flag_a=true ;;
b) param_b=$OPTARG ;;
:) echo "Опция -$OPTARG требует аргумента" >&2; usage ;;
\?) echo "Неизвестная опция -$OPTARG" >&2; usage ;;
esac
done
shift "$((OPTIND-1))" # убираем уже разобранные параметры

▶️Двоеточие в начале optstring переводит парсер в «silent mode» — ошибки по argv приходится ловить самостоятельно, зато можно отдать лайтовый help, а не cryptic usage из недр шелла. Про необходимость shift "$((OPTIND-1))" задокументировано даже в posix man-pages — так убираем из $@ опции и получаем чистый список позиционных аргументов.

➡️ Короткие флаги и их комбо
getopts умеет распаковывать слипшиеся флаги: -abc интерпретируется как -a -b -c. Если после символа ожидается аргумент, разбор прекращается ровно там:
# optstring="a:b"
$ my.sh -ac # OK: -a, -c как позиционка
$ my.sh -abx # -a, -b x
$ my.sh -ab # ошибка: -b ждёт аргумент

Edge-case — отрицательные числа (-5) внезапно принимаются за флаг. Начинайте список ожидаемых опций с --, тогда getopts прекратит работу при виде первого не-флага, и минусы в числах останутся нетронутыми.

➡️ Поддерживаем --long без сторонних тулов
Частый прием: сначала через case "$1" ловим варианты --help, --version, --long=value, а затем отдаём остаток в getopts — так не ломаем POSIX-совместимость и не тащим GNU getopt.
while [ $# -gt 0 ]; do
case "$1" in
--help) usage ;;
--output=*) opt_o=${1#*=}; shift ;;
--) shift; break ;; # двойное тире — конец опций
-*) break ;; # короткие опции разберет getopts
*) break ;;
esac
done

# теперь классический getopts
while getopts ":o:f:" opt; do
...
done
shift "$((OPTIND-1))"

▶️Схема простая: захотите — добавите alias-ы вроде --verbose/-v, или вообще YAML-конфиг после --config=path.yml.

🖼️ Дочитать статью на Habr'e

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM