354

Изучаем GNU/Linux часть 29. bash скрипты #3

Продолжаем изучать GNU/Linux и готовиться к сертификации от Red Hat (RHCSA).


Для тех, кто видит мои посты впервые - я стараюсь очень лёгким языком с нуля научить вас работать с операционной системой GNU/Linux. Зачем? Потому что - Стоит ли делать курс по RHCSA?


Предыдущие темы:

Изучаем GNU/Linux часть 28. bash скрипты #2

Изучаем GNU/Linux часть 27. bash скрипты #1

Изучаем GNU/Linux часть 26. Программный RAID - MD

Изучаем GNU/Linux часть 25. Управление логическими томами - LVM (RHCSA)

Изучаем GNU/Linux часть 24. Работа с файловыми системами (RHCSA)

Изучаем GNU/Linux часть 23. Основы файловых систем

Изучаем GNU/Linux часть 22. Работа с дисками (RHCSA)

Изучаем GNU/Linux часть 21. Ядро Linux

Изучаем GNU/Linux часть 20. Права на файлы (RHCSA)

Изучаем GNU/Linux часть 19. Пользователи и группы (RHCSA)

Изучаем GNU/Linux часть 18. Sudo (RHCSA)

Изучаем GNU/Linux часть 17. Su и visudo (RHCSA)

Изучаем GNU/Linux часть 16. Процессы #3: Работа с процессами (RHCSA)

Изучаем GNU/Linux часть 15. Процессы #2: Информация о процессах #2 (RHCSA)

Изучаем GNU/Linux часть 14. Процессы #1: Информация о процессах

Изучаем GNU/Linux часть 13. Bash #2: переменные (RHCSA)

Изучаем GNU/Linux часть 12. Bash #1: bash-completion, alias, type

Изучаем GNU/Linux часть 11. Стандартные потоки (RHCSA)


Ссылки на темы 1 лвла - Изучаем GNU/Linux часть 10. Текстовые редакторы nano и vi (RHCSA)


Проверка пользователя, параметров запуска, различные условия и подтягивание данных из файла.

P.S. Текст из видео в комментариях.


P.P.S. Мне бы пригодилась помощь в создании большого количества заданий и вопросов для обучающихся -> Задания, вопросы и ответы

GNU/Linux

1.2K пост15.6K подписчика

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

5
Автор поста оценил этот комментарий

Ты делаешь хорошие и добрые вещи.

раскрыть ветку (1)
15
Автор поста оценил этот комментарий

Почти за каждый кусочек хлебушка, который я кушаю, я обязан интернету. А точнее людям, которые писали статьи, которые я прочел, программы, которыми я пользуюсь. Не будь тех людей, которые всё это дали мне, я бы сейчас другие кусочки хлебушка кушал, возможно, не такие вкусные. Мне нравится, что я получил эти знания и программы бесплатно. И другие должны иметь возможность получать знания бесплатно. Я лишь в меру своих возможностей пережевал и вернул эти знания интернету, чтобы другие люди зайдя в интернет тоже смогли получить эти знания. Я просто делаю то, что хочу видеть от других.

показать ответы
7
Автор поста оценил этот комментарий

В прошлый раз мы с вами разобрали if. Есть еще много других команд, но if еще кое-где пригодится.

Начнём с того, что скрипт, который мы пишем, должен выполняться рутом, так как тут и команда useradd, и добавление строчки в sudoers. В самом скрипте мы нигде не пишем sudo, так как предполагаем, что либо рут запустит этот скрипт, либо пользователь с командой sudo. Но что будет, если скрипт запустить без sudo? Выполнятся все команды, правда некоторые выдадут ошибку, что недостаточно прав. Сейчас у нас скрипт небольшой, можно понять, что ничего страшного не произойдёт. Но в будущем в скрипте могут быть команды, которые могут сработать и у рута, и у обычного пользователя. И если скрипт запустится от обычного пользователя, то некоторые команды выполнятся, некоторые нет, в итоге это приведёт к неожиданным последствиям. Поэтому лучше в начале скрипта сделать проверку, а кто именно запускает скрипт. Если это рут – то всё окей, если кто-то другой – то нужно остановить скрипт и выдать ошибку, что недостаточно прав.


Условие у нас такое – проверить, является ли текущий пользователь рутом. Для этого нужно распознать текущего пользователя – это можно сделать с помощью команды id. Причём, всё завязано не на самом слове root, а на его uid, который равен 0. То есть можно встретить случаи, когда вместо root используется другой пользователь с uid-ом 0, поэтому лучше ориентироваться на uid. Команда id с ключом -u должна быть 0 (id -u; sudo id -u). Проверку нужно делать в самом начале, чтобы никакие другие команды не выполнились. Как писать условие мы знаем – if [ , дальше нам нужно выполнить команду, чтобы узнать uid и убедиться, что он не равен 0 – if [ “$(id -u)” != 0 ]. И так, если uid не равен нулю, пусть скрипт выдаст ошибку (echo root permissions required) и завершится. Чтобы завершить скрипт, используем команду exit. Также, давайте вспомним, что обычно ошибки сыпятся в stderr. И чтобы наш скрипт тоже так делал, добавим после echo направление stdout в stderr (>&2), в итоге у нас вывод echo уйдёт в stderr. Также вспомним про статусы выхода. Именно с помощью команды exit мы и будем выдавать статус выхода с ошибкой, то есть единицу (exit 1). Сохраним и проверим (./myscript, echo $? ). Как видите, статус выхода – 1. А чтобы убедиться, что ошибка в stderr, направим stderr в файл (./myscript 2>errors, cat errors). Всё работает как надо. Не забудем добавить комментарии к нашему скрипту, чтобы легче было его понимать.


Теперь давайте переделаем условие по нашей группе. Добавим еще требований – sudo права теперь должны быть у двух групп – it и security. И если имя пользователя admin, но его группа не it или security, то всё равно у него должны быть sudo права. И так, для групп нам нужно сравнивать переменную group с двумя значениями – it и security. Это можно сделать как в рамках программы скобок, используя опцию -o, то есть or ( [“$group” = it -o “$group” = security ] ), либо делать это сравнение на уровне bash-а.


Это работает примерно как с if – bash понимает статусы выхода. Обычно, когда мы хотим выполнить несколько команд разом, без скриптов, мы ставим точку с запятой между командами (ls; ls file). И даже без if можно добавить логики. Допустим, если мы хотим, чтобы выполнилась первая команда и если она выполнилась удачно, то есть статус выхода 0, выполнить вторую команду, то между командами мы ставим два амперсанда (ls && ls file; echo $?). Это называется “оператор и”. Первая команда выполнилась успешно, вследствии чего выполнилась вторая команда. Теперь перевернём команду (ls file && ls; echo $?). Как видите, первая команда выполнилась неудачно, вследствии чего вторая даже не запустилась. Теперь сделаем наоборот - если первая выполнилась удачно, то вторую даже не запускать, а если первая неудачно, то запустить вторую. Для этого используется “оператор или” – две прямые линии || . Например, в первом случае (ls || ls file; echo $?) первая команда выполнилась успешно, вследствии чего вторая команда даже не запустилась. Теперь перевернём (ls file || ls ; echo $?). Как видите, первая команда завершилась с ошибкой, вследствии чего запустилась вторая команда. Обратите внимание, в 3 из 4 случаев при использовании “оператор и” получается статус выхода не равный 0, а с “оператором или” наоборот.


Теперь сделаем тоже самое в скрипте – используем две команды скобок и поставим “оператор или” ( if [ “$group” = it] || [ “$group” = security ] ). Как мы помним, if интересует только статус выхода, и если одно из условий окажется верным, то сработают команды после then. Давайте проверим (sudo ./myscript, sudo tail /etc/sudoers ). Как видите, в sudoers добавилась группа security.

Касательно второй задачи – нам нужно пользователю админ также давать права sudo, если он не в вышеуказанных группах. У нас уже есть условие проверки на группы. Если условие не срабатывает, if закрывается. В прошлый раз я упоминал else – если условие не срабатывает, запускать другую команду. Но нам это не подойдёт – это будет работать для всех пользователей из других групп, а нам нужно, чтобы это работало только у админа. То есть нам опять же нужно проверить условие. И так, если не сработало первое условие – то есть группы другие, то нужно проверить еще одно условие – пользователя. Для этого используем команду elif, то есть else if. Синтаксис примерно такой (nano if, if условие then команда elif условие then команда elif условие then команда else команда fi). Этих elif может быть много и if завершится, когда одно из условий сработает и выполнится команда после then.


В нашем скрипте мы пишем elif [ “$user” = admin ] then и копируем строчки проверки и добавления записи в sudoers, заменяя при этом group на user. Можно было бы просто добавить пользователя admin в группу wheel, но на разных дистрибутивах это может быть группа sudo или что-то другое, поэтому надёжнее просто прописать самого пользователя. Окей, теперь проверим (sudo ./myscript, sudo tail /etc/sudoers). Как видите, запись создалась.


Пойдёмте дальше. До этого мы могли сделать наш скрипт либо интерактивным, либо вводить параметры при запуске скрипта. Теперь же, с помощью if, мы можем использовать оба варианта. Для этого нам нужно проверять, было ли что-то передано нашему скрипту в виде параметров. Если да, то использовать эти параметры. Если нет, то выводить приглашение ввести данные. И так, задача – проверить, вводил ли пользователь параметры при запуске скрипта. Мы знаем, что параметры превращаются в значение переменных $1, $2 и т.д. Нам нужно проверить, есть ли у этих переменных значения. Для этого используем тот же if со скобками с опцией -z, которая проверяет, есть ли значение у переменной. Z – это zero length, то есть пустая строка. Если у переменной значения нет, то статус выхода 0. Проверяем переменную 2, так как если она есть, есть и первая ( [ -z $2 ] ). И так, если скрипту не передали параметров, или передали всего один параметр, то стоит вывести приглашение ввести данные. Иначе стоит эти эти параметры использовать как значения переменных user и group. Ну и вывести об этом текст (user=$1, group=$2, echo Username: $user Group: $group). Теперь проверяем – сначала без параметров (sudo ./myscript), затем с одним параметром (sudo ./myscript user20) , и наконец с двумя параметрами (sudo ./myscript user21 it). Всё работает. А вы попробуйте написать так, что если вводится один параметр, скрипт будет использовать его в качестве имени пользователя, и спрашивать только имя группы. А если больше двух параметров – то выдавать ошибку, что синтаксис неправильный и завершаться.


И если уж мы это делаем для автоматизации, то нужно сделать скрипт таким, чтобы он не требовал от нас ввода или параметров. Пусть лучше он будет их брать в файле. Предположим, у нас есть компания, и HR при приёме на работу заполняет файл, а наш скрипт будет брать из этого файла данные и создавать пользователей. Для начала сделаем что-нибудь примитивное. Во первых, укажем путь к файлу, и зададим его как переменную, чтобы легче было его в дальнейшем менять (file=/var/users). Дальше. Я хочу оставить способ создания пользователей вручную, поэтому способ с файлом сделаем как одну из опций. То есть, по порядку – если скрипт запустили с параметрами, то использовать эти параметры. Если скрипт запустили без параметров, то пусть он проверит наличие нужного файла. Если файл есть, то пусть скрипт возьмёт данные из файла. Если файла нет, то пусть выведет предложение ввести данные.

Для этого я немного поменяю условия. Условие с пустой переменной 2 я переверну, тем самым проверяя, есть ли значение у переменной 2. И её команды поставлю выше. Дальше использую elif чтобы проверить наличие файла ( elif [ -f $file ]. А в конце оставлю вариант с предложением ввода. Теперь остаётся определиться с файлом. Создаём файл (sudo nano /var/users ) и прописываем в одну строчку пользователя и группу (user22 it). Теперь нам нужно из этого файла достать эти данные и назначить их в качестве значений переменным. Для этого используем команду cut. Делителем у нас выступает пробел. Столбик 1 это имя пользователя (sudo cut -d’ ‘ -f1 /var/users), а столбик два – группа ( sudo cut -d’ ‘ -f2 /var/users). Укажем это в скрипте – user=$(cut -d’ ‘ -f1 $file), group=$(cut -d’ ‘ -f2 $file). И в конце добавим строчку, чтобы показывала эти значения ( echo Username: $user Group: $group). Проверим скрипт (sudo ./myscript). Всё создалось – пользователь 22 с группой it.


В будущем мы разберём, как с помощью одного файла создавать много пользователей, сделаем файл посложнее, добавим больше данных, больше возможностей. Если у вас есть свои идеи – пишите в комментариях. И обязательно практикуйтесь – придумывайте себе задания, какими-бы они сложными не казались, любая попытка – это опыт.

показать ответы
0
Автор поста оценил этот комментарий

спасибо за уроки, классная идея! :) правда, я еще не заставил себя начать...

раскрыть ветку (1)
4
Автор поста оценил этот комментарий

Как бы банально не звучало, но мне нравится фраза - Путь в тысячу миль начинается с первого шага
Главное сделать первый шаг. Каждые выходные я знаю, что должен заставить себя сесть и сделать ролик, зная, что на это уйдёт почти весь день. И я б вообще предпочел поиграть, повтыкать в ролики на ютубе и всё такое. Но я заставляю себя сделать первый шаг - сесть и открыть текстовой редактор. Дальше предложение за предложением и уже перестаёшь замечать, как пролетел весь день.
Просто заставь себя сделать первый шаг =)

показать ответы
4
DELETED
Автор поста оценил этот комментарий

- я скачал файл из интернета, как мне его положить обратно?

- вот из-за таких как ты в интернете и кончаются файлы.

Удачи в продолжении статей, я хоть и не админю уже лет пять, но читать интересно.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Предпросмотр
0
DELETED
Автор поста оценил этот комментарий

ну вот пиратские копии винды.. их же ломает кто-то как-то.. правовой вопрос опустим пока. что-то оттуда вырезают, что-то добавляют..

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Пиратская копия - это не взломанный код. Хакеры пытаются разобраться, как именно винда считает себя активной. Условно, она обращается на сайт activation.software.com, посылает туда данные о себе и получает оттуда информацию "ok, ты лицензионна". Кряк поднимает внутри компа сервис, и указывают, что activation.software.com - это сам компьютер. Софт обращается сам к себе, посылает туда информацию, а кряковый сервис отвечает - "ок, ты активна". И софт начинает думать, что он лицензионный.

Ну это пример активации старых программ, лицензионщики со временем придумывают всё более изощрённые способы избежать кряков, а хакеры пытаются это сломать.

показать ответы
0
DELETED
Автор поста оценил этот комментарий

понял. это документация. спасибо!)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Это не документация..) Это как гусеница. Гусеница станет бабочкой. Условно, ты как-то можешь изменить гусеницу, чтобы завтра у бабочки были крылья другого цвета. Но вот бабочку в гусеницу не превратить. А если бабочка не умеет менять цвет крыльев, то с этим ты ничего не сможешь сделать

показать ответы
0
DELETED
Автор поста оценил этот комментарий

привет! прошу прощения за оффтоп. помоги, пожалуйста понять один момент. в сети тут пишут про исходный код хр, якобы выложили в сеть, и теперь, мол, хацкеры могут эту винду под себя затачивать всячески. что такое код, я в общих чертах смутно представляю.

а что такое исходный код, и почему те хацкеры не могут просто разобрать все файлы винды, как автомобиль, к примеру, чтобы понять как она устроена? почему им для этого нужен тот исходный код? те же вопросы возникают при установке линуксовых драйверов на видеокарту. типа, нвидиа зажала исходный код, поэтому вот так..

)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Привет!
Вот смотри, есть exe файл. Внутри не текст, понятный человеку, а двоичный код. Нули и единицы, которые понимает только компьютер. Люди эти нули и единицы не понимают. И превратить этот exe обратно в текст не получится. Компании дают людям вот такие вот файлы. Что внутри - знает только компьютер и разработчики.

А исходный код - это программа, написанная на "человеческом" языке, еще до того, как превратиться в компьютерный. Можно этот код прочесть, понять что к чему, изменить под себя.

Условно, у тебя есть принтер и разработчик принтера заявил, что его принтер может печатать 100 листов в минуту. И это он встроил в код принтера, в прошивку и драйвер. Тебе он даёт готовый exe файл драйвера, который ты не можешь поменять. Ты приносишь домой принтер, а принтер на 80 страницы начинает зажевывать бумагу. Ты думаешь - окей, не нужно мне 100 страниц в минуту, 70 хватит. Ты мог бы взять и поменять это значение в драйвере, чтобы было только 70 страниц. Но это ты изменить не можешь, потому что не можешь изменить exe файл, ты просто не знаешь, какие там нули на единицы поменять. Тебе нужен исходный код - понятный тебе текст. Но производитель не даёт тебе этот код. А сам производитель на этот принтер забил и исправлять не хочет. Или обещал исправить и пропал на полгода.

показать ответы
0
Автор поста оценил этот комментарий

По поводу последней фразы. Это наверное самая большая проблема, которая есть в обучении IT. Больше практикуйтесь и придумывайте себе задания посложнее.

Это сейчас, изучая новые технологии, я могу поприменять их на своей работе. А что я делал когда начинал? Просто воспроизводил всё из курсов, а когда вставал вопрос придумать что-то своё, то тут тупик.

Я так изучал шарп. Репител всё, что есть в тырнете, пока на работе не подкинулась возможность написать небольшое консольное приложение. Хоть оно и не было никому нужно, но это была гора вдохновения, т.к. наконец навыки можно применить.

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

И я бы ещё добавлял в роликах мысль о том, что стоит искать наиболее компактные и простые решения задач, которые мы делаем. Я понимаю, что речь тут о применимости баша воочию, но при условии, что есть adduser -P --interactive, который повторяет и дополняет скрипт остаётся только добивать usermod -aG sudo $user и всё.

За ролики лайк, похоже на цикл статей с хабры.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Знаю, что с заданиями сложно. Надо писать задания на каждую из тем. Идеально было бы по 100 заданий. Чтобы изучающие научились вслепую решать любую из поставленных задач. Только нужно время, чтобы составлять все эти задания. Постараюсь выделить время для этого

0
Автор поста оценил этот комментарий
Ебать, это на каком языке написано?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Текст немного под видео написан, возможно читается хреново. Я буду переделывать текст, чуть позже, когда буду делать текстовой вариант

показать ответы
8
Автор поста оценил этот комментарий
судо баш и ебашь, ебашь, ебашь...
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

таки суббота, отдыхать надо

показать ответы
0
Автор поста оценил этот комментарий
:%s/22/44/g - это vim, бро
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

да пф, это replace
ctrl+w, ctrl+r, 22, 44
это явно легче напечатать =)
я про другое говорил, именно изменение файла вручную. Ай ладно, не важно)

показать ответы
0
Автор поста оценил этот комментарий
Одной командой)
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
написание команды, типа sed-а, не считается)
показать ответы
0
Автор поста оценил этот комментарий

Да, согласен, все субъективно, но имхо - однажды познав дзен Vim, обратно пути не будет.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

возможно.. но мне, честно говоря, не совсем понравилось.. имхо, в нано меньше движений пальцами при одинаковом результате, если конечно не говорить о каком-нибудь кодинге, чем я не занимаюсь. При этом люблю многое делать горячими клавишами, считаю что меньше нажатий - больше результата - эт очень важно. Очень люблю i3wm. но вот vim пока не зашел..

показать ответы
0
Автор поста оценил этот комментарий

Vim = pro, Nano = noob, не?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

да не, каждый пользуется тем, чем ему удобно)

показать ответы
0
Автор поста оценил этот комментарий

Все прекрасно, но почему Nano вместо VIM, как-то не по православному.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

а какая разница?)

показать ответы
0
Автор поста оценил этот комментарий

Я дико извиняюсь, мона для ЛЛ ссылку на самый первый урок?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Задам может и глупый вопрос, но вдруг это имеет смысл. Хабр и пикабу - хорошо, но не очень удобно. Может как Семаев сделать репозиторий на гите и дать на него ссылку постоянную? А уже там хранить все материалы.


Дело очень хорошее и полезное делаете, хочется следить внимательно, но пикабу и хабр уж очень отвлекают.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Текст пока абсолютно не готов. Куча ошибок, команды не всегда в нужном виде, нету картинок. Пока что это наброски, по которым я делаю видео. Надо будет выделить время и начать готовить текстовой вариант. Вот ссылка на гит - https://gitlab.com/doatta/
Постараюсь в ближайшее время начать этим заниматься

показать ответы
0
Автор поста оценил этот комментарий
Vim != Vi

По остальному, ты можешь повторить любое действие нажатием лишь точки. Даже dd.
раскрыть ветку (1)
Автор поста оценил этот комментарий
Давайте посчитаем, сколько нажатий нужно на одну простую задачу в vim и nano (после открытия файла). Допустим, на смену 22 порта на 44 в файле ssh.
Версия nano
1. ctrl+w
2. 22
3. enter
4. delete
5. delete
6. 44
8. esc+3 (раскомментировать)
9. ctrl+o
10. enter
11. ctrl+x

Что насчет vim?
показать ответы
0
Автор поста оценил этот комментарий

А вы действительно в нем разбирались? На мой взгляд именно в Vim требуется наименьшее количество нажатий - именно по причине эфективности он и возлюблен профессионалами, а не потому, что он для входа/познания (лишь) чуточку сложнее.

раскрыть ветку (1)
Автор поста оценил этот комментарий

не все, но многие базовые хоткеи я знаю и умею работать. Но просто выскажу своё мнение. Допустим, что нужно, чтобы вырезать строчку на vim? dd. А в nano? ctrl+k. Что из этого проще? ctrl+к. Потому что прожимается разом. Для dd нужно два раза ткнуть одним пальцем - это банально неудобнее, чем разом прожать двумя пальцами.
Да, в моменты, когда тебе нужно 15 строчек разом вырезать - dd покажется удобнее. Но ситуаций, когда я знаю, сколько именно строчек мне нужно вырезать, довольно мало. Зачастую я просто зажимаю ctrl+k на пару секунд - результат один и тот же. Но пальцам проще.
nano - открыл, печатаешь, сохраняешь, всё разом. В vi нужно переключаться между режимами. Просто пара лишних движений.

Эти пара лишних движений при больших тасках, допустим, кодинге, имеют преимущество. Но скажем редактировать конфиги - нифига, ты просто тратишь на одну и ту же задачу больше нажатий.

показать ответы
0
Автор поста оценил этот комментарий

Вот и я о том же.
Столько сложностей и  всё нужно объяснять. Это хорошо что сейчас есть такие люди как вы и всю информацию в сети можно найти мгновенно. Но как же тяжело было когда приходилось всё это учить.


Я не буду дальше с вами спорить, потому что отчасти я с вами согласен.


if ls then
как понять, хотим ли мы посмотреть файл c названием then или продожить if?
Очень просто, например можно было так if (ls) then - так в половине языков пишется. А вот ; - только в шелл-скриптах.


Кстати, насколько я помню [ ... ] это синоним для программы test ... .

раскрыть ветку (1)
Автор поста оценил этот комментарий

просто () уже используется в баше. Ну честно, по мне баш очень удобен. Хотя у других могут быть свои предпочтения, но для них есть, например, csh - оболочка, ориентированная на любителей языка c.

Да, пишут что test и [ это синонимы, что единственное различие - что при скобках нужно в конце команды ставить знак ] .

показать ответы
Автор поста оценил этот комментарий

color_prompt = force_color_prompt != null ? "yes" : null

Ну разве это не убого?

Даже в этом простом примере не понятно с ходу:
- что за квадратные скобки (это нужно знать), и что это за -n
- зачем после них точка с запятой?
- почему в одном месте строка в кавычках, а в другом нет?

И это только в первом попавшемся примере

Даже в многословной java это будет намного понятнее написано:
color_prompt = force_color_prompt.isEmpty() ? "yes" : ""
Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

>> color_prompt = force_color_prompt != null ? "yes" : null
Это вы логику хотели показать? Я не совсем понял

Идея скриптов в том, что мы с помощью интерпретатора связываем различные программы. Скриптинг != программирование. Сейчас объясню, почему это хорошо:

- Что за квадратные скобки: это программа. Это не часть языка баш.
У баш синтаксис такой
if команда
then команды
elif команда
then команды
else команды
fi
Куда уж проще?
Поэтому обвинять баш за квадратные скобки - всё равно что обвинять язык программирования за возможность использовать системные вызовы. Не нравятся скобки - можно использовать любую другую команду, хоть самому написать понятную всем проверку переменных.

- зачем после них точка с запятой?
Синтаксис я привёл выше. Чтобы писать несколько команд в одну строчку, между командами ставятся точка с запятой. Условно, если написать
if ls then
как понять, хотим ли мы посмотреть файл c названием then или продожить if?

- почему в одном месте строка в кавычках, а в другом нет?
Нужно понимать, что баш обрабатывает команду, подставляет значения переменных, регулярных выражений и т.п., прежде чем передать их программе.  Программа [ имеет синтаксис. Допустим, хочешь сравнить переменную с числом  $a = 2, пишется [ $a = 2 ]. Но что, если переменная $a будет содержать текст с пробелами? Баш преобразует переменную в текст и тогда когда получит [ это текст = 2 ]. Синтаксис нарушится, команда подумает, что ты хочешь сравнить два значения с одним. Поэтому зачастую переменную берут в скобки, чтобы получилось [ "это текст" = 2 ]. 

показать ответы
Автор поста оценил этот комментарий

Никогда не понимал, почему язык шелл-скриптов такой костыльный и убогий. Что мешает его сделать похожим на привычные языки программирования. Что command.com виндовый, что bash. Powershell, наверное туда же.

раскрыть ветку (1)
Автор поста оценил этот комментарий

А что именно убогого в баше? По мне вполне удобный. Можете привести примеры, что именно убого в баше на ваш взгляд?

показать ответы