LINUX.ORG.RU

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

 ,


0

1

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

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

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

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


У си тоже триграфы есть, не аргумент. Для разных задач разные операторы — это меньшая из проблем.

anonymous
()

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

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

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

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

Значит и правда что-то меняется...

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

Изучай конешн.

Deleted
()

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

А как bash поймёт, какое сравнение ты имел в виду? Т.е. если бы существовала магическая операция «меньше», что бы она выдала на следующем коде:

a=231
b=25
if [[ $a меньше $b ]]; then
    echo LESS
else
    echo NOT LESS
fi
shdown
()
Последнее исправление: shdown (всего исправлений: 1)

Это ты ещё другие языки не видел :D

В линуксе без баша никуда. Но разумеется, если хочешь развиваться - то им одним ограничиваться нельзя. На самом деле это довольно скудный язык, возможностей которого начинает резко нехватать, как только твои потребности переваливают за «запустить последовательно несколько команд». На то он и был создан и с этой задачей справляется на 100%

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

Баш много больше чем среда для запуска пары команд. Это (не) интерактивная программируемая среда. Без шелла можно обойтись, но пользоваться линуксом будет угрюмо. Как виндой.

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

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

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

А как bash поймёт, какое сравнение ты имел в виду? Т.е. если бы существовала магическая операция «меньше», что бы она выдала на следующем коде:

Видимо никак, так как в баше даже типов данных нет, как я понял) Или строгой типизации вроде нет. А в других языках разве нет нормального сравнения, чтобы все сравнивалось знаками? Если тип данных известен, дальше интерпретатор отталкивается от этого знания и сравнивает данные соответственно типу. В чем тут проблема?

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

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

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

Как только начинается более-менее серьёзная работа с данными

Серьёзность задачи обратно пропорциональна знанию шелла.

Оговорюсь: решать все задачи на шелле я не предлагаю)

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

Пока ничего сложного. Мелкие задачи самое то. Я недавно форкнул софтину, полностью на баше написанную. Там и парсинг интерактивного вывода, и запись/чтение файлов с заменой содержимого, сравнения и дифы, создание конфигов для программ в рантайме, перегрузки, параллельность, локализация, модульность. Race condition, плохая обработка ошибок, наркомания, дебаг через жопу... Комплексные задачи не для баша, имхо. А то что своя специфика - не проблема. Если задача мелкая - даже баш регекспы к месту. И арифметика.

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

Если тип данных известен

Ну вот прочитал ты из файла строку, содержащую число. Что дальше?

#!/bin/bash
a='1'
b='01'

if [ "${a}" -eq "${b}" ]; then
	echo 'a = b'
else
	echo 'a ≠ b'
fi

if [ "${a}" = "${b}" ]; then
	echo 'a = b'
else
	echo 'a ≠ b'
fi

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

В необходимости конвертации строки в число, очевидно.

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

По-моему это была бы сильная динамическая типизация как раз, если бы всё в нём было строками. Просто разные операции над типами данных в строках. Но кроме строк там есть ещё ассоциативные массивы. А еще можно объявить переменную как число, и она магическим образом начнет быстрее инкрементироваться, скажем (я не знаю подробностей исполнения, но я знаю такой наблюдаемый эффект).

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

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

anonymous
()

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

Это шутники какие-то. Они бы ещё SQL тебе порекомендовали как первый язык.

он какой-то не от мира сего

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

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)

BASH === Bourne Again SHell. Из этого следует, что был ещё Bourne shell, а до этого просто shell. Вот из того древнего shell родом из 60-х всё и растёт. Например, никаких сравнений в shell не было, поэтому этим занималась программа test, откуда и растут все эти -eq и -gt, которые являлись ключами этой программы (впрочем, и до сих пор являются, потому что команда test никуда не делась, просто в подавляющем большинстве случаев пользуются её версией, встроенной в баш).

gremlin_the_red ★★★★★
()

Bash – говно.

Посоветовали bash, потому что несложный

С такими советчиками и враги не нужны. Должны были посоветовать Python.

EXL ★★★★★
()

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

Я так понял, что это был юмор, и вам нужна публика для него, а не «познание мира».

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

Не удержался

BASH === Bourne Again SHell. Из этого следует, что был ещё Bourne shell, а до этого просто shell.

А до этого просто hell.

Grzegorz
()
Ответ на: Не удержался от Grzegorz

Ну почему сразу Hell. До этого симпотичные девочки перфокарты с твоими командами в компуктер вводили.

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

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

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

Ну вот прочитал ты из файла строку, содержащую число. Что дальше?

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

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

как это решается в других языках

Bash - не ЯП, bash - интерпретатор команд! Разные вещи! Разные задачи!

zvezdochiot

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

Это шутники какие-то. Они бы ещё SQL тебе порекомендовали как первый язык.

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

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

Может быть позже, не все сразу.

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

Пасиба за исторический экскурс. Про test я читал, в баше это вроде аналогично записи [ условие ], когда условие одно. А если много условий, то надо в двойных скобочках [[ условие ]] писать.

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

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

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

Ну там можно использовать операторы, которые запрещены в [ ] одинарных скобках (&&, || например).

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

Т.е. интерпретатор баша не поймет чем мы хотим считать это- строкой или числом

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

Примеры:

declare -i i
if [[ -z $i ]]; then echo "uninitialized"; fi
if [[ i -eq 0 ]]; then echo "zero detected"; fi
s1=" 1"
arr[s1]=s # без ошибки присвоится для [1]
for i in $s1; do
    echo "list element $i"
done
и так далее.

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

Ну там можно использовать операторы, которые запрещены в [ ]

См. опции -a, -o, ...

А также см. [...] && [...].

zvezdochiot

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

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

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

Называй это как хочешь

Что значит, называй это как хочешь?

Даю наводящие вопросы:

  • bash - это ЯП?
  • Цели создания bash (его функции)?
  • Известные тебе ЯП могут полноценно выполнять функцию shell-а?

zvezdochiot

anonymous
()

Bash не ЯП, а командная оболочка в первую очередь, отсюда и все тонкости. И да, совет тебе дали странный, но Bash — офигенно полезный скилл. Выбирай между C, Go и Python в зависимости от своих целей.

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

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

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

любой другой (особенно интерпретируемый) язык способен заменить шелл

Ну так и сидите на своих ЯП! Чо Вы на bash-е застряли то?

zvezdochiot

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

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

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

no-such-file ★★★★★
()

Баш - это именно та вещь, из-за которой линукс находится в такой жопе. Помнишь статью про PHP? Так вот, баш - это то же самое, только в 15 раз хуже.

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

А кто застрял-то? Лично я баш давно использую только как командную оболочку и для однострочников, все скрипты пишу на перле, чаще на 5, иногда на 6.

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

Известные тебе ЯП могут полноценно выполнять функцию shell-а?

Tcl

Ты не буковки, ты ссылки давай, человек «хороший».

zvezdochiot

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