TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #753 9.82K
Привет. Я устал от сложностей написания Bash курса и решил отдохнуть и написать статью.

🔤🔤🔥🔤🔤🔤🔤

Если кто-то не пьет на Новый Год - читайте эту статью. Голова кружится не хуже, чем от алкоголя.

ㅤ
Сегодня поговорим об очень редко используемом и на мой взгляд, абсолютно ненужном и неадекватно работающем операторе bash. И сравним его с классикой.

Представляю Вашему вниманию тернарный (троичной) оператор.

В мануале он выглядит так:

expr1 ? expr2 : expr3


Работает оператор так: если expr1 истина, то результат expr2, иначе expr3.

Для исследования я написал небольшую тестовую программу

#!/bin/bash
declare -i c=033 #27
declare -i d=044 #36
declare -i k=0 #counter

function wait2sec(){
sleep 2
echo $1
}

SECONDS=0
a=$((1 == 2?$(wait2sec c):$(wait2sec d))) #0
echo $((k++)) sec=$SECONDS a=$a

SECONDS=0
((a=1==2?$(wait2sec c):$(wait2sec d))) #1
echo $((k++)) sec=$SECONDS a=$a

SECONDS=0
a=$((1==2?$(wait2sec c):$(wait2sec d))) #2
echo $((k++)) sec=$SECONDS a=$a

SECONDS=0
[[ 1 == 2 ]] && a=$(wait2sec c) || a=$(wait2sec d) #3
echo $((k++)) sec=$SECONDS a=$a

SECONDS=0
[[ 1==2 ]] && a=$(wait2sec c) || a=$(wait2sec d) #4
echo $((k++)) sec=$SECONDS a=$a

####### result #############
# 0 sec=4 a=36
# 1 sec=4 a=36
# 2 sec=4 a=36
# 3 sec=2 a=d
# 4 sec=2 a=c


Функция wait2sec ждет 2 секунды и печатает первый параметр. Дальше идут пять как бы одинаковых блоков.

1 == 2 - expr1 (false) 
wait2sec c - expr2
wait2sec d - expr3


Анализируем результаты:

1. переменные d и с описаны как целые, но начинаются с 0, поэтому bash интерпретирует их как восьмеричные.

2. Тернарный оператор может использоваться только внутри арифметической подсистемы ((...)), в которой переменные допускается извлекать(получать значение) без знака $, поэтому c и d интерпретируются как переменные.

3. У тернарного оператора допустима даже "упоротая" форма (блок 1)

4. В математической подсистеме при сравнении пробелы вокруг знака сравнения на влияют на результат.

5. В блоке 4 допущена ошибка (нет пробелов вокруг знака сравнения, поэтому 1==2 - интерпретируется не как результат сравнения, а как не пустая строка, поэтому результат (истина) не верный. Такие ошибки очень трудно отлаживать.

6. В отличие от классического, башевского, сравнения при использовании тернарного оператора expr2 и expr3 вычисляются вне зависимости от условия. Об этом говорит удвоенное время выполнения блока.

🔤🔤🔤🔤🔤🔤
🅰️🅰️

Всех приглашаю на БЕСПЛАТНЫЙ курс BASH. 👇

➡️ Записаться: https://t.me/+0j3ugyfKJH1iYzg6

Начало курса 11 января. До окончания записи 25 дней.

Ссылку на группу для общения по курсу сообщу после начала курса. Заходите и проходите опросы.

tags: #bash #linux
—
🔔 @bashdays➡️ @gitgate
More from @bashdays
  1. Sep 24, 2026Post #1565
  2. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  3. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  4. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
  5. Sep 11, 2026🤖 DevOps в эпоху AI трансформации: что работает уже сейчас! 17 сентября Сбер собирает Dev…
  6. Sep 9, 2026Всем привет, с вами TagdTagd! Я тут вынужденно перешёл на MAX. Просто Telegram перестал ра…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →