Содержание

Перевод конспекта по bash, который содержит в себе выжимку самых основных возможностей Bourne again shell. Конспект будет полезен любому программисту.

Конспект по bash. Продолжение
В этом посте автор описал синтаксические конструкции, привел примеры простых сценариев и указал на некоторые подводные камни в bash. Он уверен, что такой конспект обязательно пригодится как начинающим, так и опытным разработчикам, которые могли забыть некоторые особенности этой сверхмощной командной оболочки.

Конвейеры – это команды, которые соединены операторами ; , && , || для выполнения в определенной последовательности. Операторы организации конвейеров работают следующим образом:

  • команда1 ; команда2 – команда2 выполняется после команды1 независимо от результата её работы ;
  • команда1 && команда2 – команда2 выполняется только после успешного выполнения команды1(то есть с кодом завершения 0);
  • команда1 || команда2 – команда2 выполняется только после неудачного выполнения команды1 (то есть код завершения команды1 будет отличным от 0)

В скриптовом языке bash поддерживаются два оператора ветвления: if и case . Оператор if , как и в других языках, выполняет определенный блок указаний, в зависимости от условия. Условие помещают в двойные квадратные скобки [[ . ]] , которые bash рассматривает как один элемент с кодом выхода. Внутри блока операторов помещенных в [[ ]] разрешается использовать операторы && и || . Например:

Обратите внимание, что [ , условие и ] обязательно должны быть разделены пробелами, иначе оболочка воспримет в качестве команды [условие .

Ниже приведена таблица с возможными условиями сравнения:

Если необходимо сделать выбор из нескольких альтернатив, пригодится оператор case. Принцип его работы легче понять на примере:

В примере оператор проверяет значение переменной $extension на совпадение с одним из шаблонов и в случае совпадения выполнит соответствующий блок кода. Если же совпадений не будет, выполнятся указания, соответствующие шаблону * .

Язык оболочки дает пользователю возможность организовывать циклическое выполнение инструкций при помощи циклов: *

while

Оператор while описывается следующим образом:

Интерпретатор в первую очередь выполняет команды, описанные в условии . Если результат выполнения нулевой, то выполняется тело, а после ее выполнения, переход к следующей итерации, в противном случае происходит выход из цикла. В условии может быть любая допустимая команда. Например:

Цикл for выполняет тело для каждого элемента из списка. Синтаксис цикла for таков:

В качестве элементов обычно используют различные шаблоны (wildcards). Очень удобно применять for для прохождения по каталогам и выполнения операций над группой файлов. В примере ниже, цикл проходит по всем файлам с расширением *.bash , перемещает их в директорию

/scripts и добавляет их права на исполнение.

select

Цикл select помогает организовать удобное меню выбора и применяется тогда, когда пользователь должен выбрать один элемент из предложенного списка. В общем цикл select имеет такой же синтаксис, как и цикл for :

При выполнении этого оператора, все элементы из списка высвечиваются на экране со своими порядковыми номерами в виде списка вариантов ответа, после списка выводится специальное приглашение для ввода. Обычно оно имеет вид #? . Введенный пользователем номер списка записывается в переменную ответ. Если ответ содержит номер пункта меню, то в переменную заносится значение соответствующего элемента из списка. Если в списке нет введенного пункта, список будет показан снова. После того, как пользователь сделает правильный выбор, выполнятся указания в теле, а цикл перейдет к следующей итерации и все действия повторятся с самого начала – именно поэтому работу цикла select желательно прерывать.

Пример выше запрашивает у пользователя название пакета, который он желает установить, далее интересуется тем какой пакетный менеджер использовать и в зависимости от выбора устанавливает нужный пакет и останавливает выполнение.
Оболочка также имеет команды, которые изменяют нормальное выполнение цикла. Оператор break полностью останавливает выполнение цикла, оператор continue – переходит к следующей итерации.

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

Объявление функции имеет следующий вид:

Объявление функции обязательно должно предшествовать ее первый вызов. Обращение к функции происходит путем указания ее имени в качестве команды.
Функция может принимать аргументы и возвращать после своего выполнения результат – код выхода. Функция обращается к своим аргументам точно так же, как и к локальным переменным, с помощью позиционных переменных – $1 , $2 и тд. Результат работы можно возвращать с помощью команды return . Например, функция, которая принимает параметр (имя) и завершает свою работу с кодом 0:

Команда return возвращает код завершения 0 – это код успешного завершения сценария. Каждая программа по завершению работы записывает в переменную окружения #? код завершения – число от 0 до 255. С помощью этой переменной можно определять статус выполнения каждой отдельной команды или скрипта. Если программа завершилась ошибкой, кодом завершения будет целое число отличное от нуля. Обратите внимание, на то что, если сценарий завершается командой exit без параметров, кодом завершения сценария будет код завершения последней выполненной команды.

Оболочка дает несколько средств для отладки сценариев. Для активации режима отладки, он должен быть запущен с помощью специальных опций.
Первая строка сценария должна иметь вид:

Можно выбирать среди следующих функций:
–n – читать все команды, но не выполнять их;
–v – выводить все строки по мере их обработки интерпретатором;
*–x – выводить все команды и их аргументы по мере их выполнения.

Для отладки сценария частями, нужный фрагмент отмечают вызовом команды set с помощью соответствующей опции из таблицы. Причем, для включения режима отладки, перед опцией указывают символ – , для отключения режима отладки используют + :

Общая практика отладки заключается в том, чтобы прежде чем запустить ее, необходимо проверить его синтаксис с помощью опции -n . Для большей детальности можно комбинировать ключи -nv . После исправления синтаксических ошибок проводится отладка с помощью опции -x .

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

Вы пропустили

AEGIS Algorithms Android Angular Apache Airflow Apache Druid Apache Flink Apache Spark API API Canvas AppSec Architecture Artificial Intelligence Astro Authentication Authorization AutoGPT AWS AWS Aurora AWS Boto3 AWS EC2 AWS Lambda Azure Babylon.js Backend bash Beautiful Soup Bento UI Big Data Binary Tree Browser API Bun Career Cassandra Charts ChatGPT Chrome Extension Clean Code CLI ClickHouse Coding Codux Combine Compose Computer Context Fusion Copilot Cosmo Route CProgramming cron Cryptography CSS CTF Cypress DALL-E Data Analysis Data science Database dbt dbt Cloud deno Design Design Patterns Detekt Development Distributed Systems Django Docker Docker Hub Drizzle DRY DuckDB Express FastAPI Flask Flutter For Beginners Front End Development Game Development GCN GCP Geospatial Git GitHub Actions GitHub Pages Gitlab GMS GoFr Golang Google Google Sheets Google Wire GPT-3 GPT3 Gradio Gradle Grafana Graphic Design GraphQL gRPC Guidance HMS Hotwire HTML Huawei HuggingFace IndexedDB InfoSec Interview iOS Jackknife Java JavaScript Jetpack Compose JSON Kafka Kotlin Kubernetes LangChain Laravel Linux LlaMA LLM localStorage Logging Machine Learning Magento Math Mermaid Micro Frontends Mobile Mobile App Development mondayDB MongoDB Mongoose MySQL Naming NestJS NET NetMock Networks NextJS NLP Node.js Nodejs NoSQL NPM OOP OpenAI OTP Pandas PDF PHP Playwright Plotly Polars PostgreSQL Prefect Productivity Programming Prometheus Puppeteer Pushover Python Pytorch Quarkus Rabbitmq RAG Ramda Raspberry Pi React React Native Reactor Redis REST API Revolut Riverpod RProgramming Ruby Ruby on Rails Rust Scalene SCDB ScyllaDB Selenium Servers Sklearn SLO SnowFlake Snowkase Software Architecture Software Development Solara Solid Spring Boot SQL SQLite Streamlit SudoLang Supabase Swift SwiftUI Tailwind CSS Taipy Terraform Testing Transformers TURN TypeScript Ubuntu UI Design Unix UX UX Design Vim Vite VSCode Vue Web Architecture Web Components Web Development Web Frameworks Web Scraping Web-разработка Webassembly Websocket Whisper Widgets WordPress YAML YouTube Zed Наука о данных Разное Тренды

Как исследовать и визуализировать данные МО для обнаружения объектов на изображениях