19 полезных shell-скриптов на все случаи жизни

Продолжаем изучать и применять основные и часто используемые команды. Для лучшего понимания этой части, советую сначала проделать основные команды Bash. часть 1, и только потом приступать ко 2 части заданий.

Обработка нескольких аргументов командной строки в 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 находится адрес ссылки. Отпадает необходимость избыточных проверок на наличие или отсутствие флага.

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

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

Читайте также:  iOS 14: всё про новую версию ОС для iPhone

Однако, иногда возникает ситуация, когда за опциональным аргументом следует обязательный. К примеру, дополним наш воображаемый скрипт флагом -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 все значения сместились на две позиции и их количество также уменьшилось.

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

Если Файл Существует, То …

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

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

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

В следующих примерах напечатаем соответствующие сообщения по результатам выполнения команды test.

Дельный Совет: Конструкция CASE — это простейшая форма конструкции IF-THEN-ELSE! Если у вас много ELIF элементов — то лучше использовать CASE! Читать далее →

$ if [ -f «/etc/passwd» ]; then echo «Файл существует»; fi Файл существует

$ if [ ! -f «/etc/bebebe» ]; then echo «Файл не существует»; fi Файл не существует

$ [ -f «/etc/passwd» ] && echo «Файл существует» || echo «Файл не существует» Файл существует $ [ -f «/etc/bebebe» ] && echo «Файл существует» || echo «Файл не существует» Файл не существует

Условные операторы

Двойные квадратные скобки [[ … ]] bash интерпретирует как один элемент с кодом возврата. Внутри разрешается использование операторов && и ||.

## Однострочная запись [[ -f /dir/file ]] || { echo «File not exists»; exit 1; } ## Вложенные условия if [ … ] && [ … ]; then … elif [[ … && … ]]; then … else … fi;

Читайте также:  Как разместить свое приложение в магазине App Store

Пример проверки что переменная не пустая:

if [[ $some_var != » ]]; then echo ‘Переменная не пустая’ fi

Комбинированные условия с отрицанием:

if [ -f /path/ ] && [ ! -z «$status» ]; then echo «Файл и переменная существуют» else echo «Нет файла или переменной» fi

Оператор case:

case «$extension» in (html|htm) echo «Это HTML файл» ;; pdf) echo «Это PDF файл» ;; *) echo «Не известный тип файла: $extension» ;; esac

Условия сравнения

Смотрите доп. условия проверки файлов —

### Файлы ### -e Проверить что файл существует (-f, -d) -f Файл существует (!-f — не существует) -d Каталог существует -s Файл существует и не пустой -r Файл существует и доступен на чтение -w … на запись -x … на выполнение -h Символическая ссылка -b Файл существует и является блочным устройством -с Файл существует и является символьным устройством (character device) -p Файл существует и является потоковым устройством (pipe device) -S Файл существует и является сокетом ### Строки ### -z Пустая строка -n Не пустая строка == Равно (!= не равно) ### Числа ### -eq Равно -ne Не равно -lt Меньше -le Меньше или равно -gt Больше -ge Больше или равно

Установка дефолтного значения переменной

Не работает для массивов!

Установка значения по умолчанию для аргумента:

SOME_VAR=${1:-‘default’} # Если первый аргумент ($1) пустой — присвоить строку SOME_VAR=${2:-$default} # Если аргумент $2 пустой — установить значение $default : ${my_var:=$default} # Если $my_var пустая — присвоить ей значение из $default

Установка дефолтного значения для существующей переменной:

TEST=’YES’ : ${TEST:=’some string’} echo $TEST # YES

Вместо выводов

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

Читайте также:  Задаем статический IP адрес в Ubuntu Server 20.04

Каким путем пойти — выбирать тебе. Встанешь ли ты на темную сторону или выберешь путь джедая?

telnet

Документация по Bash.

В справке man оболочке bash посвящен большой раздел. Кроме того, есть объемный справочный материал, который выводится командой info bash. Разумеется, этот файл есть и в Интернете:

Почти во всех дистрибутивах Linux bash считается стандартной оболочкой для работы с оболочками и окнами терминалов. Однако, воспользовавшись системой управления пакетами вашего дистрибутива, вы можете установить и многие другие оболочки. Профессионалы Linux особенно любят Z-оболочку zsh.

Другие варианты — оболочки Korn (ksh или pdksh) и C (csh или tcsh). Чтобы опробовать любую из этих оболочек после установки, запустите командное окно и введите в него имя любой оболочки. Команда exit выведет вас обратно в предыдущую активную оболочку.

user$ zsh hostname% ls (Выполнение команд в zsh) … hostname% exit (Обратно в предыдущую оболочку) user$

Выбор другой оболочки, загружаемой по умолчанию. Для любого пользователя, вошедшего в Linux, система предусматривает стандартную оболочку. Она автоматически запускается в командном окне при работе с терминалом, то есть стандартная оболочка сохраняется в файле /etc/passwd. Название оболочки указывается в самом конце строки с учетной записью каждого пользователя.

Чтобы задать по умолчанию другую оболочку, выполните команду chsh (change shell). Программы оболочки сохраняются в каталоге /bin. Это значит, что требуется указать, например, /bin/csh в том случае, если вы собираетесь в дальнейшем работать с оболочкой C.

Вот такие полезные мысли, для тех, кто лучше хочет понять Linux и пользоваться им на высоком уровне.

Опубликовано © Просто Linux | Всё про Линукс, Android и Windows.