Расширение команды Bash

В процессе написания bash скриптов, довольно часто возникает необходимость проверить существует ли как-то файл прежде чем предпринимать какие-либо действия.

Управление дисковой системой

  • Проверьте геометрию диска, установленного на вашем компьютере с помощью fdisk -l. (изучите таблицу разделов вашего жесткого магнитного диска). /sbin/fdisk -l /dev/sda
  • На каком разделе вашего диска имеется область подкачки swap? В разделе sda5 (у вас может быть другой раздел)
  • Определите размер сектора жесткого диска. 512 байт (fdisk -l)
  • Изучите содержимое файла /etc/fstab, определите подходит ли какая-либо запись для монтирования CD-ROM? Если нет, то какая запись в /etc/fstab должна быть? cat /etc/fstab (если такой записи нет, нужно добавить: mount -t iso9660 -r /dev/cdrom /media/cdrom )
  • Выведите информацию об использовании дискового пространства на всех смонтированных блочных устройствах в системе. df -h
  • Получите информацию об использовании дискового пространства домашним каталогом du -sh ~ (s — без информации о подкаталогах)
  • Обработка нескольких аргументов командной строки в shell-скрипте

    Для наглядности представим, что существует простой скрипт. Он работает в качестве обёртки к чему-то на подобии curl: если передать в него ссылку, то содержимое web-страницы будет скачано и сохранено в файле на локальном диске. К тому же, с помощью воображаемого флага -a можно увидеть ход работы.

    Команда для выполнения сценария в bash будет выглядеть следующим образом:

    -a

    Аргументы командной строки инициализируются в том же порядке: $0 = , $1 = -a, $2 = и их общее количество $# = 2.

    Стоит помнить, что $# – количество всех аргументов, а не сумма слов в команде. Можно подумать, что если скрипт вызывается без каких-либо параметров, то $# должно равняться 1 (учитывая имя сценария), однако на самом деле $#=0.

    Подобная особенность нумерации существует с зари развития UNIX и известна под названием “проблема нулевого индекса”. Так, в массивах первое значение можно получить по индексу 0 или array[0]. Для многих разработчиков это понятно, для других же – вызывает затруднение. Начинающие программисты могут даже игнорировать нулевой индекс в языке C и начинать использовать ячейки массива с 1, а не 0.

    После успешной проверки на наличие флага -a для первого аргумента ($1) следует переместить все значения остальных параметров ($2) на одну позицию влево ($1=$2). Тогда в остальной части программы можно будет считать, что в $1 находится адрес ссылки. Отпадает необходимость избыточных проверок на наличие или отсутствие флага.

    Читайте также:  Beats BeatsX 2018 & Бюджетная версия наушников с чипом Apple W1

    Это можно сделать с помощью команды сдвига (shift). В итоге получаем правильный способ обработки одного опционального аргумента командной строки в shell-скрипте:

    flag_a=0 if [ "$1" = "-a" ]; then flag_a=1 shift fi url=$1

    Однако, иногда возникает ситуация, когда за опциональным аргументом следует обязательный. К примеру, дополним наш воображаемый скрипт флагом -o, после которого необходимо указать путь к файлу для сохранения страницы.

    Решить эту задачу можно немного изменив предыдущий пример:

    outputspecified=0 if [ "$1" = "-o" ]; then outputspecified=1 outputfilename="$2" shift 2 fi

    Таким образом, команда shift принимает одно число. Оно указывает на сколько позиций необходимо сдвинуть значения аргументов командной строки. Это легко продемонстрировать, если вывести их до и после выполнения блока кода с shift 2:

    $ sh -o какая-то-ссылка $# = 3 $1 = -o $2 = $3 = какая-то-ссылка —— выполнение команды shift 2 —— $# = 1 $1 = какая-то ссылка $2 = $3 =

    Изначально все три аргумента заданы и их количество ($#) равно 3. После выполнения shift 2 все значения сместились на две позиции и их количество также уменьшилось.

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

    Advanced bash

    [[ > [

    [ (команда «test») и [[ (новый тест) используются для вычисления выражений. [[ работает только в Bash, Zsh и Korn shell. Также он более мощный. [ доступен в POSIX shells.

    #POSIX [ «$variable» ] || echo ‘переменная не задана или пуста’ [ -f «$filename» ] || printf ‘Файла (обычного) нет: %s\n’ «$filename» if [[ ! -e $file ]]; then echo «Файла нет, лидо он не доступен: $file» fi if [[ $file0 -nt $file1 ]]; then printf ‘файл %s новее %s\n’ «$file0» «$file1» fi

    Короче говоря, в bash мы используем [[ ]] — он новее, быстрее и т.д. Если имеем какую-нибудь старую POSIX-совместимую Unix оболочку, то используем [ ]. По большей части синтаксис [[ ]] и [ ] схож.

    # Унарные операции [[ -d $file ]] # файл типа директория [[ -e $file ]] # файл любого типа (проверка на существование (exists)) [[ -f $file ]] # обычный файл [[ ! -f $file ]] # не (обычный файл). «!» — отрицание [[ -z $var ]] # истина, когда переменная пуста (zero) [[ -n $var ]] # ложь , когда переменная пуста (nonzero) [[ -r $file ]] # файл существует и доступен для чтения [[ -w $file ]] # файл существует и доступен для запись [[ -x $file ]] # догадайтесь сами # Сравнение строк (лексикографический порядок) [[ a < b ]] [[ dog > cat ]] [[ sh = sh ]] [[ bash != sh ]] # Сравнение чисел [[ 5 -lt 10 ]] # less than [[ 100 -gt 99 ]] # greater than [[ 5 -eq 05 ]] # equal [[ 50 -ne 05 ]] # not equal # Логические операции [[ -n $var && -f $var ]] # переменная определеня и есть файл, указанный в ней. [[ $(pwd) == $HOME || $(pwd) == ‘/’ ]] # мы в директории $HOME или в корне. # Сравнение с шаблоном [[ $(pwd) == $HOME/* ]] # мы в поддиректории домашней папки или в ней # Регулярные выражения [[ $(date) =~ ^пятница ]] && echo Сегодня пара по ОСям

    Читайте также:  Все в одном: как выбрать моноблок для офиса или дома

    printf

    printf — везде!

    Его можно найти в bash, C, C++, python, perl, php, …

    По сути — форматированный вывод. Рассмотрим варианты шаблонов вывода:

    %c Символ %d Десятичное целое число со знаком %i Десятичное целое число со знаком %e Научный формат (строчная буква е) %Е Научный формат (прописная буква Е) %f Десятичное число с плавающей точкой %g В зависимости от того, какой формат короче, применяется либо %e, либо %f %G В зависимости от того, какой формат короче, применяется либо %E, либо %f %o Восьмеричное число без знака %s Строка символов %u Десятичное целое число без знака %x Шестнадцатеричное число без знака (строчные буквы) %X Шестнадцатеричное число без знака (прописные буквы) %% Знак %

    Хех, не всё так просто!

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

    Немного примеров:

    printf «%s\n» «Hello world» # Вывести строку с переводом строки printf «%.2f рублей» 2,3333333 # «2,33 рублей» printf «\e[1;34m%.3d\e[0m\n» 42 # Вывести жирным синим цифры

    Не успели. Всё же 2 пары за одну… Успели бы без ответов на вопросы. Но это не наш путь!

    • awk
    • раскраска вывода
    • sed

    Так что же такое оболочка?

    Оболочка в первую очередь предназначена для вызова команд и программ Linux. Таким образом, она является своего рода интерпретатором команд (сравнимым с из мира MS-DOS). Оболочка выполняется в любом командном окне, например konsole, gnome-terminal, xterm, и в любой текстовой консоли после входа в систему (логина).

    Читайте также:  Apple выпустила финальную версию iOS 12.0.1

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

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

    Если вы не знаете, с какой версией оболочки работаете, выполните следующую команду:

    user$ echo $0 -bash user$ $BASH_VERSION (1)-release

    Bash Script: Существует ли Файл?

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

    Создайте пустой файл с помощью команды touch

    Сделайте его исполняемым chmod +x

    Откройте в текстовом редакторе и скопируйте следующий код:

    #!/bin/bash FILE=$1 if [ -f $FILE ]; then echo «Файл ‘$FILE’ существует.» else echo «Файл ‘$FILE’ не найден.» fi

    Дельный Совет: Хороший bash скрипт должен печатать соответствующее сообщение и прерываться если ему не переданы необходимые аргументы! Это очень легко настроить! Читать далее →

    Сохраните и выполните скрипт:

    $ ./ /etc/bebebe Файл ‘/etc/bebebe’ не найден. $ ./ /etc/passwd Файл ‘/etc/passwd’ существует.

    Конвееры

    В составных командах и цепочке конвееров используются операторы управления ;, &&, ||. Тут все довольно просто, главное запомнить алгоритм и порядок, по которому работают эти операторы:

    1. Команда cmd2 будет выполнена по завершении команды cmd1 не зависимо от результата работы cmd1:

    cmd1; cmd2

    2. Команда cmd2 будет выполнена после успешного выполнения cmd1 (код завершения = 0):

    cmd1 && cmd2

    3. Команда cmd2 будет выполнена, если код завершения cmd1 отличен от 0 (произошла ошибка):

    cmd1 || cmd2

    #bash, #conditions, #pipe, #array