Bash - не только про строки. В нtм легко использовать побитовую арифметику (&, |, ^, ~, <<, >>) для управления флагами, что бывает полезно в админских скриптах.
▪️ Базовая логика. Каждый бит числа можно трактовать как флаг (0 - выключено, 1 - включено):
FLAG_READ=1 # 0001
FLAG_WRITE=2 # 0010
FLAG_EXEC=4 # 0100
FLAG_DELETE=8 # 1000
▪️ Установка флага (OR |)
rights=0
rights=$(( rights | FLAG_READ | FLAG_WRITE ))
echo $rights # 3 (0001 + 0010 = 0011)
▪️ Проверка флага (AND &)
if (( rights & FLAG_WRITE )); then
echo "Есть право записи"
fi
▪️ Сброс флага (AND + NOT &~)
rights=$(( rights & ~FLAG_READ ))
echo $rights # теперь без read
▪️ Инверсия (XOR ^)
rights=$(( rights ^ FLAG_EXEC )) # переключение: если был - уберется, если не был - включится
▪️ Практические кейсы
1️⃣ Система разрешений в скриптах. Можно задавать доступ к операциям через биты вместо кучи if:
if (( user_flags & FLAG_DELETE )); then
rm "$file"
fi
2️⃣ Упаковка нескольких состояний в одно число. Например, код статуса сервиса:
STATUS_RUNNING=1
STATUS_RESTARTING=2
STATUS_FAILED=4
status=$(( STATUS_RUNNING | STATUS_RESTARTING ))
(( status & STATUS_FAILED )) && echo "Ошибка!"
3️⃣ Быстрые флаги для CLI-опций
OPT_VERBOSE=1
OPT_DRYRUN=2
OPT_FORCE=4
opts=0
[[ $1 == "-v" ]] && opts=$(( opts | OPT_VERBOSE ))
[[ $1 == "-f" ]] && opts=$(( opts | OPT_FORCE ))
(( opts & OPT_VERBOSE )) && echo "[VERBOSE MODE]"
4️⃣ Флаги как компактная замена массивов. Вместо массива enabled_features=(...) можно хранить все в одной переменной. Это особенно ценно при передаче значений между процессами.
BashTex 📱 #bash #utils