Самые распространенные Bash велосипеды, которые в 99% повторяются у моих студентов.
Оно конечно работает правильно. Но бывалый глаз сразу ощутит дискомфорт глядя на такие конструкции.
Кстати я всегда придерживаюсь правила — одну задачу можно решить разными способами. Работает, да и пёс с ним. Но учить такому других, увы непозволительно, пусть лучше сразу правильно делают. Нормально делай, нормально будет.
Поехали!
cat bashdays.txt | cut -f 2 -d ';'
В текстовом файле bashdays.txt у меня забита строка: hello;world. Далее команда cat читает этот файл и перенаправляет данные на утилиту cut с помощью pipe «|». А cut уже режет строку по символу «;» и отдает мне второй элемент. То есть на выходе я получу: «world».
Но. Утилита cut сама умеет читать файлы. Проще говоря так:
cut -f 2 -d ';' bashdays.txt
Сюда можно приплести и grep, с которым обычно делают так:
cat bashdays.txt | grep "world"
Это прям любимый паттерн всех, забит в днк, даже я этим порой грешу. Это как на велосипеде, один раз научился, больше не разучишься. А по хорошему надо делать так:
grep "world" bashdays.txt
Ну и к примеру еще такое встречается часто:
cat bashdays.txt | tr 'a-z' 'A-Z'
Суть одна, cat передает данные в tr, а дальше они конвертятся в верхний регистр и выводятся на экран. По хорошему это было бы так:
tr 'a-z' 'A-Z' < bashdays.txt
Но опять же для кого по-хорошему? Мне привычнее вариант с cat, переучиваться я уж точно не буду.
➕ Подпишись на BashDays в телеграм
А еще из любимого, это циклы, ща покажу:
for s in $(ls)
do
echo "$s"
done
Это цикл, который перебирает файлы. Тут вообще зачем-то используется вызов внешней утилиты ls, хотя она тут вообще не упёрлась. Да и если такое использовать в скриптах, вылезут баги.
Например, создай такой файл:
touch "*"
И заново запусти этот цикл. ООйой… заметил прикол? Вывод продублировал все имена файлов. Вот тебе и баг, а потом сиди полдня, думай, что же оно не работает.
Этот костыль можно и перекостылисть, указав утилите ls параметр -Q. Тогда утилита ls тепло обнимет кавычками все имена файлов. Но это лишние кавычки, потом их чо? Снова обрезать?
Правильнее было бы так:
for s in ./*; do echo "$s"; done
Не вызывается никакая внешняя утилита, да и безопаснее в разы, в плане наличия багов если у файла будет какое-то корявое имя.
Перлов конечно много встречается, но это прям основные. Если что-то еще экстренно вспомню, закину в телеграм комментарии. Ну либо ты закидывай, мы всегда рады твоей активности!
Обещал на выходные тебя не беспокоить, но видимо не получится. Так, что увидимся совсем скоро. Хороших тебе предстоящих выходных и береги себя!