LINUX.ORG.RU

Немного мыслей про bash, какой-то он не очень

 ,


0

1

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

А еще куча мелких нелогичностей всплывает по мере изучения. Например, условия сравнения.

Флажки (-lt, -gt и т.д.) работают только для чисел, а знаки (>, < и т.д.) только для строк- ну кто придумал эту тупость? Зачем придумывать дублирующий функционал (вот эти флажки), а потом намерено делать так, чтобы одно работало только с числами, а другое только со строками?

И много еще такой фигни в баше?)


Ответ на: комментарий от Kroz

Перестань использовать операторы больше/меньше на строках.

Флаги для чисел. Знаки для строк. В чем проблема?

divlns
() автор топика
Ответ на: комментарий от i-rinat

Из всех итераций только с c_d будет истина в условии, и End будет пропущено.

Я наконец понял в чем моя проблема с этим примером. Просто забыл как работает continue. Мне почему-то втемяшилось что continue дает команду «продолжать выполнение программы дальше», а оно как раз говорит перейти на следующее значение переменной, т.е. ниже программа выполняться не будет, а т.к. «c_d» была последней переменной в цикле, то и печататься 5й раз «End» не будет. Наконец все стало на свои места...

Но как понять что «c_d» > «c» мне все-равно непонятно) Просто сложить сумму ascii-кодов 3х символов? Так это работает?

divlns
() автор топика
Ответ на: комментарий от divlns

Но как понять что «c_d» > «c» мне все-равно непонятно

Вообще-то и не нужно понимать. Достаточно помнить, что какой-то порядок есть.

Для деталей нужно смотреть в сишные strcmp или strcoll, или как там сравнение в баше реализовано.

Просто сложить сумму ascii-кодов 3х символов?

Это ещё откуда? Когда список фамилий по алфавиту сортируешь, ты же не считаешь сумму кодов букв.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от divlns

Эквивалентное общее начало. У второго длина больше — значит он больше.

anonymous
()

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

над тобой жестко пошутили

MyTrooName ★★★★★
()
Ответ на: комментарий от Kroz

Это как сказать. Взять, к примеру, библиотеки сишные, особенно из-под glib. Их много? Много. Всё покрывают? Всё. На ООП-языках буду в основном сишными либами пользоваться? Буду. ООП ли это? Вроде как нет, язык не про ООП, а принципы внезапно есть.

Так что не надо мне на голову натягивать мешок вашей парадигмы, я её не заказывал. Мне и процедурщины, и функциональщины хватит за глаза, без нагромождения классов на классах, погоняемых ФабрикамиПроблем и прочими синглтонами, я вполне могу обходиться.

anonymous
()
Ответ на: комментарий от Kroz

Я говорю о том, что статическая типизация - это инструмент, которым нужно овладеть, и научиться

Okay. Я могу в эти две вещи. Но так как декларации типов в питоне преподносят как веяние статической типизации и зачем-то требуют их использовать, почему-то оправдывая это использование косвенными плюсами от статической типизации, не имеющими отношения к текущей сути type declarations в питоне (docstrings, вид сбоку), я прихожу к единственно возможному выводу о том, что такие поползновения на статическую типизацию без самой статической типизации вводят людей в заблуждение, а значит, вредны. Они не подходят ни под один из двух сценариев, а значит, различать тут нечего.

Как-то вы опустили в своём тексте Perl. Интересно, почему?

Он более сложен и новичку поначалу может взорвать мозг и отбить желание программировать вообще.

По сравнению с пирамидами из Паскаля, Си гораздо легче. Никакого бойлерплейта, отличающегося в разных частях программы и всего этого «деревянного» вида. Мне, перейдя с Паскаля на Си, Паскаль представился просто упущенным временем.

А синтаксис Ruby вы могли бы мельком увидеть. И сравнить. Вы же говорите про то, что питон хороший, так сравните его с соседями по весовой категории, попытайтесь доказать себе его высшее положение. Не надо же полагаться на миллионы, а то вы так и Java начнёте школьникам преподавать. 3 billion devices же не могут ошибаться?

В целом, для обучения программированию (даже не так, а просто для вбития себе в голову навыков понимания чужеродного синтаксиса), люди используют то, что пришлось использовать первым. И вряд ли это бывает полноценный ЯП. Если вы покажете полноценный ЯП человеку, не видевшего ни одного DSL, человек вряд ли возьмёт и запомнит. Человек испугается.

anonymous
()
Ответ на: комментарий от MyTrooName

над тобой жестко пошутили

Да как-то пофиг. Если не разберусь даже в этом, то и в программирование больше не полезу. А пока идем потихоньку)

divlns
() автор топика
Ответ на: комментарий от Kroz

Просто чувак скинул по скайпу и спросил что будет. И это меня заставило задуматься, правда скорее из-за невнимательности, не так понимал работу continue.

divlns
() автор топика
Ответ на: комментарий от i-rinat

Это ещё откуда? Когда список фамилий по алфавиту сортируешь, ты же не считаешь сумму кодов букв.

Не знаю откуда. Просто если сравнивается «a» и «b», то сравнивается их ascii-код, а если сравнивается «a» и «c_d», то ведь тоже сравнивается ascii-код? С одной стороны 61, а с другой стороны что?

divlns
() автор топика

Посоветовали bash, потому что несложный (так мне сказали). Но вот синтаксис что-то не обрадовал. Мне одному показалось что он какой-то не от мира сего?

Он совсем не для этого. Многие не понимают, что сила баша именно в интерактивности: максимальной простоте и удобстве составления интерактивных конструкций. Это не язык программирования в общем случае. И скрипты на нем не следует писать больше 20-30 строк.

Im_not_a_robot ★★★★★
()
Ответ на: комментарий от Im_not_a_robot

И скрипты на нем не следует писать больше 20-30 строк.

Из-за сложности/запутанности синтаксиса?

divlns
() автор топика
Ответ на: комментарий от divlns

Bash использует для сравнения строк либо strcoll, если он есть, либо strcmp. Алгоритм strcoll достаточно хитрый, поэтому для простоты лучше посмотреть в strcmp. Вот примитивная реализация strcmp из glibc:

int
STRCMP (const char *p1, const char *p2)
{
  const unsigned char *s1 = (const unsigned char *) p1;
  const unsigned char *s2 = (const unsigned char *) p2;
  unsigned char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
        return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}

Как видишь, строки сравниваются, пока символы в одинаковых позициях одинаковые и пока c1 не окажется ‘\0’. В твоём случае сравниваются строки {'c', '\0'} и {'c', '_', 'd', '\0'}. Первые байты одинаковые, вторые разные, причём c1 — ноль. c2 — не ноль, поэтому strcmp() возвращает отрицательное число. Это значит, что первая строка, «c», по порядку находится до «c_d».

i-rinat ★★★★★
()
Ответ на: комментарий от divlns

Из-за сложности/запутанности синтаксиса?

Он не сложный и не запутанный, он оптимизирован для интерактивной работы, т.е. не написал скрипт и забыл, а сооружаешь допустим пайп из разных команд в реальном времени. Это довольно распространенное непонимание предназначения bash, особенно у людей из виндоус-мира. Даже у майкрософт: они соорудили PowerShell и гордятся, что он МОЩНЕЙ баша, совершенно не понимая его суть. Пытаются втолкнуть в шелл настоящий язык программирования с CamellToe и прочими фишками. А он не для этого. В шелле ценится быстрый и простой набор команд.

Im_not_a_robot ★★★★★
()
Ответ на: комментарий от Im_not_a_robot

posh для скриптов. А чисто что-то делать в оболочке, ну так это надо рассматривать в конкретной ситуации, в чем-то одно удобней другого, в чем-то наоборот.

anonymous
()
Ответ на: комментарий от divlns

Если не разберусь даже в этом, то и в программирование больше не полезу

Что значит — «даже»? Начинать изучение программирования с баша — странная идея. Это не самое простое занятие, и сложность тут дурная, ненужная, сложившаяся исторически как результат беспорядочного развития. От того, что разберёшься с тонкостями баша, пользы будет мало. Лучше уж освоить сначала Python.

hbee ★★★★
()
Ответ на: комментарий от hbee

Да дерьмо питон, дерьмо, без стеройдов не живет

anonymous
()
Ответ на: комментарий от i-rinat

Спасибо за разъяснение, стало попонятнее.

divlns
() автор топика
Ответ на: комментарий от MyTrooName

не, ну хозяин барин. но сириусли. передумай.

Зачем передумывать если пока интересно?) Тут уже мильен человек сказали что в линуксе пригодится знание баша. Не год же я буду его учить (надеюсь).

divlns
() автор топика
Ответ на: комментарий от hbee

Так уж и быть, переформулирую свою мыслю: Если не разберусь даже в этом, то попробую питон)) Вот сразу позитивней стало!

divlns
() автор топика
Ответ на: комментарий от gremlin_the_red

lazarus - не язык, а ide, язык там как раз object pascal. delphi - и ide, и язык, точнее диалект object pascal

исключительно из занудства

anonymous
()
Ответ на: комментарий от divlns

Зачем передумывать если пока интересно?)

так и быть, разрешаю :)

но я как бы тоже за питон

MyTrooName ★★★★★
()
Последнее исправление: MyTrooName (всего исправлений: 1)
Ответ на: комментарий от anonymous

Дельфи дельфями делал не язык (не зря же был и Borland C++ Builder, ЕМНИП, именно на нём Age of Wonders 1/2 делали), а VCL. Так же и лазарус — это не столько object pascal, сколько LCL.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от gremlin_the_red

и причем кресты, ну, тут кроме того, что оно тоже от борланда? vcl и ее аналог lcl - это просто component library и к языку она относится также как и культи к крестам

anonymous
()
Ответ на: комментарий от anonymous

и причем кресты, ну, тут кроме того, что оно тоже от борланда?

Оно тоже на VCL. То есть не суть важно, на каком языке программа, определяющим является VCL.

и к языку она относится также как и культи к крестам

Я, собственно, об этом и говорил. Главное в qt приложениях не то, что они С++, а то, что они Qt. Главное в Double Commander не то, что он на паскале, а то, что он на LCL. Фреймворк, а не язык, является определяющим.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от gremlin_the_red

Фреймворк, а не язык, является определяющим.

всегда? для кого? зачем?

на фреймфорке не пишут

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.