Как передать переменные (параметры) из одного bash-скрипта другому скрипту

4.1 Вызов Bash

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

-norc

Не читает инициализацию файла ‘~/.bashrc’ в диалоговой
оболочке. Это по умолчанию, если оболочка вызывается как sh.

-rcfile имя_файла

Выполняет команды из файла имя_файла (вместо ‘~/.bashrc’) в
диалоговой оболочке.

-nonprofile

Не загружает файл начальных действий системы ‘/etc/profile’
или любой из файлов персональной инициализации
‘~/.bash-profile’ ,’~/bash-login’ или ‘~/.profile’, когда
Bash вызывается как login.

-version

выводит номер версии оболочки.

-login

включает оболочку, как если бы она вызывалась с login. Это
эквивалентно ‘exec — bash’, но может происходить из другой
оболочки, такой как csh. Если вы хотите заменить вашу
текущую входную оболочку Bash, вы должны набрать ‘exec bash
-login’.

-nonbraceexpansion

Не выполняет brace-расширение (см. раздел 2.2).

-nonlineediting

Не использует библиотеку GNU (СМ. главу 7 «Редактирование
командной строки») для чтения диалоговых командных строк.

-posix

Изменяет поведение Bash в соответствии со стандартом Posix
1003.2, когда операция по умолчанию отличается от этого
стандарта. Это предназначено для того, чтобы строго
подчинить Bash стандарту.

-c строка

Читает и выполняет команды со строки после выполнения опций,
затем выходит.

-i

Заставляет оболочку выполнять команды в интерактивном
режиме.

-s

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

Написание функций Bash

Сначала нужно понять что такое функция в нашем контексте. Функция — это набор команд, объединенных одним именем, которые выполняют определенную задачу. Функция вызывается по ее имени, может принимать параметры и возвращать результат работы. Одним словом, функции Bash работают так же, как и в других языках программирования.

Синтаксис создания функции очень прост:

имя_функции() { список_команд }

Имя функции не должно совпадать ни с одной из существующих команд или функций, а все команды в теле функции пишутся с новой строки.

Простая функция

Давайте напишем небольшую функцию, которая будет выводить строку на экран:

$ vi function.sh

#!/bin/bash
printstr(){
echo «hello world»
}
printstr

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

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

Аргументы функции

Аргументы функции нужно передавать при вызове, а читаются они точно так же, как и аргументы скрипта. Синтаксис вызова функции с параметрами bash такой:

имя_функции аргумент1 аргумент2 … аргументN

Как видите, все достаточно просто. Параметры разделяются пробелом. Теперь улучшим нашу функцию, чтобы она выводила заданную нами строку:

Можно сделать, чтобы параметров было несколько:

Есть и другой способ извлекать аргументы, как в Си, с помощью стека. Мы извлекаем первый аргумент, затем сдвигаем указатель стека аргументов на единицу и снова извлекаем первый аргумент. И так далее:

Возврат результата функции

Вы можете не только использовать функции с параметрами bash, но и получить от нее результат работы. Для этого используется команда return. Она завершает функцию и возвращает числовое значение кода возврата. Он может быть от 0 до 255:

Если вам нужно применить возврат значения функции bash, а не статус код, используйте echo. Строка не сразу выводится в терминал, а возвращается в качестве результата функции и ее можно записать в переменную, а затем использовать:

Экспорт функций

Вы можете сделать функцию доступной вне скрипта с помощью команды declare:

Затем запустите скрипт с помощью команды source:

Рекурсия

Вы можете вызвать функцию из нее же самой, чтобы сделать рекурсию:

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

Локальные переменные в функции

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

Библиотеки функций

Мы можем взять некоторые функции bash и объединить их в одну библиотеку, чтобы иметь возможность одной командой импортировать эти функции. Это делается похожим образом на экспорт функций. Сначала создадим файл библиотеки:

test1(){
echo «Hello World from 1»;
}
test2(){
echo «Hello World from 2»;
}
test3(){
echo «Hello World from 3»;
}

Теперь создадим скрипт, который будет использовать наши функции. Импортировать библиотеку можно с помощью команды source или просто указав имя скрипта:

Чтение данных из файла

Команда 
read может, при каждом вызове, читать одну строку текста из файла. Когда в файле больше не останется непрочитанных строк, она просто остановится. Если нужно получить в скрипте всё содержимое файла, можно, с помощью конвейера, передать результаты вызова команды 
cat для файла, конструкции 
while, которая содержит команду 
read (конечно, использование команды 
cat выглядит примитивно, но наша цель — показать всё максимально просто, ориентируясь на новичков; опытные пользователи, уверены, это поймут).

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

#!/bin/bash
count=1
cat myfile | while read line
do
echo «Line $count: $line»
count=$(( $count + 1 ))
done
echo «Finished»

1
2
3
4
5
6
7
8

#!/bin/bash

count=1

cat myfile|whileread line

do

echo»Line $count: $line»

count=$(($count+1))

done

echo»Finished»

Посмотрим на него в деле.

Чтение данных из файла

Тут мы передали в цикл 
while содержимое файла и перебрали все строки этого файла, выводя номер и содержимое каждой из них.

Возвращаемые значения

В отличие от функций в «реальных» языках программирования, функции Bash не позволяют вам возвращать значение при вызове. Когда функция bash завершает свою работу, ее возвращаемое значение является состоянием последнего оператора, выполненного в функции, для успеха и ненулевого десятичного числа в диапазоне 1 — 255 для отказа.

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

~ / Return_values.sh

Чтобы на самом деле вернуть произвольное значение из функции, нам нужно использовать другие методы. Самый простой вариант — присвоить результат функции глобальной переменной:

~ / Return_values.sh

Другой, лучший вариант для возврата значения из функции отправить значение с помощью эха или , как показано ниже:

~ / Return_values.sh

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

! — логический оператор НЕ и оператор истории

Восклицательный знак (!) — это логический оператор, который означает НЕ.

В этой командной строке есть две команды:

[! -d ./backup] && mkdir ./backup
  • Первая команда — это текст в квадратных скобках;
  • Вторая команда — это текст, который следует за двойными амперсандами &&.

Первая команда использует ! в качестве логического оператора. Квадратные скобки указывают на то, что будет проведено испытание. Опция  -d (directory) проверяет наличие каталога с именем backup. Вторая команда создает каталог.

Поскольку двойные амперсанды разделяют две команды, Bash выполнит вторую только в случае успеха первой  . Однако это противоположность того, что нам нужно. Если проверка для «резервной» директории прошла успешно, нам не нужно её создавать. И если проверка для каталога «backup» не пройдена, вторая команда не будет выполнена, а отсутствующий каталог не будет создан.

Это где логический оператор ! входит. Он действует как логическое НЕ. Таким образом, если тест пройден успешно (т.е каталог существует), он ! переходит на «НЕ успешно», что является ошибкой. Итак, вторая команда не активирована.

Если проверка каталога не пройдена (т.е каталог не существует), ! ответ изменяется на «НЕ сбой», что является успехом . Таким образом, команда для создания недостающего каталога будет выполнена.

Чтобы проверить состояние папки резервной копии, вы используете ls команду и параметры -l (длинный список) и -d (каталог), как показано ниже:

ls -l -d backup

Вы также можете запускать команды из истории команд с восклицательным знаком. Команда history выводит список вашей истории команд, а затем Вы набираете номер команды, с которой хотите выполнить ее повторно !, как показано ниже:

!24

Следующая команда повторно запускает предыдущую команду:

!!

? — как знак подстановки символа

Оболочка Bash поддерживает три символа подстановки, одним из которых является знак вопроса (?). Вы используете «подстановочные» знаки для замены символов в шаблонах имен файлов. Имя файла, которое содержит «подстановочный» знак, формирует шаблон, который соответствует диапазону имен файлов, а не одному.

«Подстановочный» знак вопроса представляет ровно один символ. Рассмотрим следующий шаблон имени файла:

ls badge? .txt

Это переводится как: «перечислить любой файл с именем, начинающимся с «badge» и сопровождаемым любым отдельным символом перед расширением имени файла».

Это соответствует следующим файлам

Обратите внимание, что у некоторых есть цифры, а у некоторых есть буквы после части имени файла в виде значка. «Подстановочный» знак вопроса будет соответствовать как буквам, так и цифрам

Этот шаблон имени файла не соответствует значению «badge.txt», поскольку в имени файла нет ни одного символа между «значком» и расширением файла. «Подстановочный» знак вопроса должен совпадать с соответствующим символом в имени файла.

Вы также можете использовать знак вопроса, чтобы найти все файлы с определенным количеством символов в именах файлов. Здесь перечислены все текстовые файлы, которые содержат ровно пять символов в имени файла:

ls ?????. txt

Область действия переменных

Глобальные переменные — это переменные, к которым можно получить доступ из любого места в скрипте независимо от области видимости. В Bash все переменные по умолчанию определены как глобальные, даже если они объявлены внутри функции.

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

Чтобы лучше проиллюстрировать, как работает область видимости переменных в Bash, давайте рассмотрим этот пример:

~ / Variables_scope.sh

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

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

Из приведенного выше вывода можно сделать вывод, что:

  • Когда локальная переменная устанавливается внутри тела функции с тем же именем, что и существующая глобальная переменная, она будет иметь приоритет над глобальной переменной.
  • Глобальные переменные могут быть изменены внутри функции.

Циклы. Цикл until-do.

Синтаксис

until TEST-COMMAND; do CONSEQUENT-COMMANDS; done # синтаксис для записи цикла в одну строку

Оператор case

Оператор case всегда завершается ключевым словом esac.

case строка in
шаблон)
список операторов
;;
 ]
esac

Оператор case поочерёдно сравнивает строку с шаблонами. Если шаблон совпадает, то выполняется группа операторов, находящихся между шаблоном и специальными символами «;;». После выполнения всех строк управление передается операторам, находящимся за ключевым словом esac.

Функции

Функцию в shell можно определить двумя способами: при помощи оператора function или после имени функции написать открывающую и закрывающую круглые скобки. Тело функции располагается между фигурными скобками.

eval

eval arg1  ... 

Транслирует список аргументов, из списка, в команды.

Пример. Демонстрация команды eval

#!/bin/bash

y=`eval ls -l`  # Подобно y=`ls -l`
echo $y         # но символы перевода строки не выводятся, поскольку имя переменной не в кавычках.
echo
echo "$y"       # Если имя переменной записать в кавычках -- символы перевода строки сохраняются.

echo; echo

y=`eval df`     # Аналогично y=`df`
echo $y         # но без символов перевода строки.

#  Когда производится подавление вывода символов LF (перевод строки), то анализ
#+ результатов различными утилитами, такими как awk, можно сделать проще.

exit 0

getopts

getopts — это встроенная в shell команда, позволяющая разобрать командную строку, передаваемую программе. Она понимает только параметры, написанные в стиле Что такое POSIX, т.е «-v -t -f file» и т.п.

trap — обработка прерываний

Команда trap позволяет переопределить стандартную реакцию программы на получаемые сигналы. Бывает необходимо защитить выполнение программы от прерывания. Формат команды trap:

trap 'список команд' сигналы

Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в «сигналы», то будет выполнен «список команд», после чего (если в списке команд не была выполнена команда «exit») управление вернется в точку прерывания и продолжится выполнение командного файла.

Наиболее часто приходится встречаться со следующими прерываниями, соответствующими сигналам:

0 	выход из интерпретатора,
1 	отбой (отключение удаленного абонента),
2 	прерывание от <Del>,
9 	уничтожение (не перехватывается),
15 	окончание выполнения.

Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в «/tmp», то это может быть выполнено командой «trap»:

 trap 'rm /tmp/* ; exit 1' 1 2 15

которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлён выход «exit» из командного файла.

Команда «trap» позволяет и просто игнорировать прерывания, если «список команд» пустой. Так например, если команда «cmd» выполняется очень долго, а пользователь решил отключиться от системы, то для продолжения выполнения этой команды можно написать, запустив команду в фоновом режиме:

  ( trap '' 1; cmd )&

Горячие клавиши Bash (hotkeys bash)

Таблица комбинаций клавиш консоли Bash (терминала Linux).

  • ctrl+d выйти из терминала
  • ctrl+l очистить экран, аналог команды clear.
  • ctrl+a переместить курсор в начало строки
  • ctrl+e переместить курсор в конец строки
  • ctrl+u удалить все символы от курсора до начала строки
  • ctrl+k удалить все символы от курсора до конца строки
  • ctrl+w удалить слово перед курсором
  • ctrl+b переместить курсор на один символ влево
  • ctrl+f переместить курсор на один символ вправо
  • ctrl+t поменять местами символ слева от курсора и под курсором
  • ctrl+h удалить символ слева от курсора
  • ctrl+p предыдущая команда в истории bash
  • ctrl+n следующая команда в истории bash
  • ctrl+r реверсивный поиск команд в истории bash
  • ctrl+y вставляет последнюю удалённую с помощью ctrl+u или ctrl+k строку
  • ctrl+m выполнение команды, аналог
  • ctrl+o выполняет команду, при этом оставляя её в командной строке для дальнейшего использования
  • Tab+Tab выводит список команд. При наличии какого нибудь символа(-ов) выводит команды по введённым символам.
  • ctrl+c отменить последнюю введённую команду
  • ctrl+x+v показать версию bash
  • ctrl+s стоп режим. Блокирует вывод на консоль. При этом все данные отображённые на экране остаются неизменными.
  • ctrl+q выход из стоп-режима

Конфигурационные файлы инициализации Bash

Когда Bash вызывается как интерактивная оболочка, первым делом он читает и вызывает команды из файла /etc/profile, если этот файл существует. После чтения этого файла, он смотрит следующие файлы в данном порядке: ~/.bash_profile, ~/.bash_login, и ~/.profile, читает и вызывает команды из них. При выходе Bash читает и выполняет команды из файла ~/.bash_logout. Также Bash использует команды из файла ~/.bashrc. Это может быть отменено опцией –norc. Опция –rcfile заставит Bash использовать команды из ~/.bashrc

Синтаксис.

  • Оператор точка позволяет включать код находящийся в другом файле (после точки и перед именем загружаемого файла ставится пробел). Этот оператор часто используют для включения конфигурационных параметров, находящихся во внешних файлах.
  • Двойные кавычки — экранирует пробелы в значении переменных, например echo «This UID=$UID». Знак $ и обратные кавычки («), заключенные в двойные кавычки, сохраняют свойства специальных символов.
  • Одинарные кавычки экранируют все специальные символы. Т.е. символ $ в echo ‘$sym ‘не будет интерпретироваться как специальный символ, а выведется как текст.
  • Обратные одинарные кавычки « служат для подстановки данных. В том месте где будет использована подстановка, будет подставляться то, что программа вывела бы на стандартный вывод. Вместо кавычек можно использовать круглые скобки со знаком $. Ниже команды идентичны:
    `date`
    $(date)
  • Символ ; Оболочка bash допускает последовательное выполнение команд — одна за другой. Для этого серия команд вводится одной строкой, и разделяется символом ;. В этом случае сначала выполняется команда 1, по ее завершении команда 2 и т.д. Например
    $ cd ~; ls *.txt; cp *.txt $HOME/temp/
  • Свойства переменных в shell script:
    • не типизированы (значения в переменных считаются строками, и только если переменная будет использоваться в математическом выражении, будет происходить проверка типа переменной),
    • область видимости переменных — весь код программы (если переменная будет определена в функции, она все равно будет глобальной переменной и к ней можно будет обращаться из любого места программы),
    • при обращении к неопределенной переменной не выдаются ошибки,
    • регистрозависимые.
  • echo и метасимволы в bash. Для использования метасимволов \n (перевод на новую строку), \t и других в команде echo может потребоваться использование ключа -e двух символов обратного слеша или же можно использовать конструкции $’\X’, ниже команды идентичны по результату свой работы:
    #!/bin/bash
    
    echo -e \\n\\tfirst
    echo $'\n\t'second

Подсчёт параметров

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

Опробуем её:

#!/bin/bash
echo There were $# parameters passed.

1
2

#!/bin/bash

echo There were$# parameters passed.

Вызовем сценарий.

./myscript 1 2 3 4 5

1 .myscript12345

В результате скрипт сообщит о том, что ему передано 5 параметров.

Подсчёт количества параметров в скрипте

Эта переменная даёт необычный способ получения последнего из переданных скрипту параметров, не требующий знания их количества. Вот как это выглядит:

#!/bin/bash
echo The last parameter was ${!#}

1
2

#!/bin/bash

echoThelastparameterwas${!#}

Вызовем скрипт и посмотрим, что он выведет.

Обращение к последнему параметру

4.6 Переменные Bash.

Эти переменные задаются и используются Bash, но в других оболочках
обычно специально не рассматриваются.

HISTCONTROL
history_control

При присвоении значения ‘ignorespace’ строки, начинающиеся с
пробела или табуляции, не вводятся в список истории. При присвоении значения ‘ignoredups’ строка, соответствующая прошлой
введенной строке, не вводится. ‘ignoreboth’ сочетает эти две
опции. Присвоение любого другого значения обозначает сохранение всех строк в списке «истории».

HISTFILE

Имя файла, хранящего команду истории.

HISTSIZE

Если задана, это максимальное число команд, которые должны быть
запомнены в истории.

histchars

Восходит к трем символам, контролирующим расширение истории,
быстрое замещение и лексемизацию (см. раздел 6.1 «Диалог истории»). Первый символ — символ расширения истории, обозначающий
начало расширения истории — обычно ‘!’. Второй обозначает быструю замену при нахождении первого символа на строке, обычно
‘^’. Опционный третий символ помечает остаток строки — комментарий, когда он найден как первый символ слова, обычно ‘#’.
Символ комментария истории вызывает замену истории, игнорируемую для оставшихся слов на строке. Не обязательно вызывает синтаксический разбор оболочки для рассмотрения остатка строки как
комментария.

HISTCMD

Номер истории или индекс списка истории текущей команды. Если
HISTCMD не задана, она теряет свои специальные свойства, даже
если впоследствии она опять задается.

hostname_completion_file
HOSTFILE

Содержит имя файла в том же формате, что и ‘/etc/hosts’, которое должно считываться, когда оболочке нужно завершить
hostname. Вы можете иэменить файл в диалоговом режиме. В следующий раз, когда вы попытаетесь завершить hostname, Bash добавит содержание файла к уже существующей базе данных.

MAILCHECK

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

PROMPT_COMMAND

Если есть, содержит строку с командой для выполнения перед выводом каждой базовой команды приглашения ($PS1).

UID

Числовой идентификатор реального пользователя для текущего
пользователя.

ЕUID

Числовой идентификатор зффективного пользователя для текущего
пользователя.

HOSTTYPE

Строка, описывающая машину, на которой запущен Bash.

OSTYPE

Cтрока, описывающая операционную систему, в которой запущен
Bash.

FIGNORE

Разделенный двоеточиями список суффиксов, игнорируемых при завершении имени файла. Имя файла, чей суффикс соответствует одному из приведенных в FIGNORE, извлекается из списка соответствующих имен файлов. Образцовое значение — ‘.o:~’.

INPUTRC

Имя файла начальных действий Readline, заменяемое по умолчанию
на ‘~/.inputrc’.

BASH_VERSION

Имя версии текущего зкземпляра Bash.

IGNOREEOF

Контролирует получение символа EOF оболочкой в отдельном вводе.
Если задана, то ее значение — число последовательных символов
EOF, которые могут быть считаны как первые символы строки ввода перед выходом из оболочки. Если переменная существует, но не
имеет числового значения, то по умолчанию зто 10. Если переменная не существует, EOF отмечает конец ввода в оболочку. Действует только в диалоговых оболочках.

no_exit_on_failed_exec

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

nolinks

Если есть, говорит о том, что не нужно следовать символическим
указателям в командах, изменяющих текущий рабочий каталог. По
умолчанию Bash следует по логической цепи каталогов при выполнении команд таких как cd, изменяющая рабочий каталог.
Например, если ‘/usr/sys/’ — указатель на ‘/usr/local/sys’, то:

Если nolinks существует, то:

См. также описание опции -p встроенной команды set, раздел 4.5.

Настройка переменных среды bash

Введите команду export и два раза нажмите клавишу Таb, получим список переменных в этом сеансе bash, которые можно изменить или просмотреть командой echo.

  • Вывести переменные окружения.
    $ env | more
    SSH_AGENT_PID=1326
    TERM=xterm
    SHELL=/bin/bash
    ...
    $ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
  • export — добавить переменную окружения pp=1. С помощью команды export присваивается переменной окружения определённое значение. Если переменная не существует, она будет немедленно создана. Если переменная уже имеет какое-то значение, оно будет потеряно.
    # export pp=1
  • unset — удалить переменную окружения pp
    # unset pp

    Чтобы старое значение переменой не терялось, например нужно добавить в переменную PATH новый каталог, нужно использовать такую конструкцию:

    $ export PATH=$PATH:/ваш/новый/каталог
  • Временно изменить редактор по умолчанию vi на nano
    # export EDITOR=nano

    Для постоянного применения нового редактора, нужно добавить в строку файл $HOME/.bashrc

    # nano .bashrc
    
    # set default editor nano
    export EDITOR="nano"
    # OR
    # set default editor vi
    #export EDITOR="vi"

Циклы. Цикл for-in.

Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение в списке поочерёдно присваивается переменной.
Синтаксис следующий:

for переменная in 
do
команды
done

for NAME ; do COMMANDS; done # синтаксис для записи цикла в одну строку

Если ключевое слово do находится в одной строке со словом for, то после списка аргументов (перед do) необходимо ставить точку с запятой.

for arg in  ; do

Рассмотрим небольшой пример:

#!/bin/bash
for i in 0 1 2 3 4 # переменной $i будем поочерёдно присваивать значения от 0 до 4 включительно
do
echo "Number is $i"
done #цикл окончен
exit 0

В переменную $i поочерёдно подставляются значения из списка и в цикле идёт работа со значением этой переменной.

Элементы в списке могут разделяться символами пробела или табуляции. Если список не помещается на одну строку, его можно продолжить на следующей, но перед тем как нажать на Enter, поставьте символ «\» для экранирования значения символа перевода строки.

Пример получения данных из внешнего файла с фильтрацией содержимого файла. В нем сначала отбираются первые поля файла (разделение полей — пробел), а затем удаляются комментарии т.е. строки начинающиеся на символ «#».

#!/bin/bash

for i in `cat ipset.txt | cut -f1 -d ' ' | sed -e '/^#/ d'`
do
echo "$i"
done
exit 0

; — разделитель команд оболочки

В командной строке Вы можете вводить столько команд, сколько Вам нужно, если Вы разделяете каждую из них точкой с запятой (;). Мы сделаем это в следующем примере:

ls> count.txt; wc -l count.txt; rm count.txt

Обратите внимание, что вторая команда выполняется даже в случае сбоя первой, третья — даже в случае сбоя второй и тд. Если Вы хотите остановить последовательность выполнения в случае сбоя одной команды, используйте двойной амперсанд (&&) вместо точки с запятой:

Если Вы хотите остановить последовательность выполнения в случае сбоя одной команды, используйте двойной амперсанд (&&) вместо точки с запятой:

cd ./doesntexist && cp ~ / Documents / reports / *.

4.2 Файлы начальных действий оболочки

Когда и как Bash выполняет файлы начальных действий:

  • Для login-оболочек (имеет место для опции -nonprofile):
    • при входе:
      • Если ‘/etc/profile’ существует, то сделать его источником.
      • Если ‘~/bash_profile’ существует, сделать его источником,
        иначе если ‘~/.bash_login’ существует, сделать его источником,
        иначе if ‘~/.profile’ существует, сделать его источником.
    • При выходе:
  • Для диалоговых не-login-оболочек (имеет место для опций -norc and
    -rcfiles):
    • При входе:
  • Для недиалоговых оболочек:
    • При входе:

Таким образом обычно ~/bash_profile содержит строку:

Если Bash вызывается как sh, он старается как можно больше походить
на sh. Для login-оболочки он пытается использовать в качестве
источника только ‘/etc/profile’ и ‘~/.profile’, в таком порядке. Oпция
nonprofile может при этом использоваться для блокирования режима.
Оболочка, вызванная sh, не пытается использовать в качестве источника
ни один из файлов начальных действий.

Когда Bash запускается в режиме POSIX опцией -posix командной
строки, он следует стандарту Posix 1003.2 для файлов начальных
действий. В этом режиме переменная ENV расширяется, и этот файл
используется в качестве источника; другие файлы начальных действий не
считываются.

# Комментарий или «обрезка строк»

Чаще всего вы используете хеш или знак числа (#), чтобы сообщить оболочке, что ниже следует комментарий, и он не должен на него воздействовать. Вы можете использовать его в сценариях оболочки и, — менее полезно, — в командной строке.

# This will be ignored by the Bash shell

Однако он не игнорируется, потому что он добавлен в историю команд.

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

В этом примере мы присваиваем текст «Dave Geek!» переменной.

this_string="Dave Geek!"

Эта команда использует echo для печати слова «How-To» в окне терминала. Он извлекает значение, хранящееся в строковой переменной, через расширение параметра . Поскольку мы добавляем хеш и текст «Dave», он обрезает эту часть строки перед тем, как передать её в echo.

echo How-To ${this_string#Dave}

Это не меняет значение, хранящееся в строковой переменной; это влияет только на то, что отправлено echo. Мы можем использовать echo для печати значения строковой переменной еще раз и проверить это:

echo $this_string

Обработка ключей со значениями

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

./myscript -a test1 -b -c test2

1 .myscript-atest1-b-ctest2

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

#!/bin/bash
while
do
case «$1» in
-a) echo «Found the -a option«;;
-b) param=»$2»
echo «Found the -b option, with parameter value $param»
shift ;;
-c) echo «Found the -c option»;;
—) shift
break ;;
*) echo «$1 is not an option»;;
esac
shift
done
count=1
for param in «$@»
do
echo «Parameter #$count: $param»
count=$(( $count + 1 ))
done

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#!/bin/bash

while-n»$1″

do

case»$1″in

-a)echo»Found the -a option»;;

-b)param=»$2″

echo»Found the -b option, with parameter value $param»

shift;;

-c)echo»Found the -c option»;;

—)shift

break;;

*)echo»$1 is not an option»;;

esac
shift
done

count=1

forparam in»$@»

do

echo»Parameter #$count: $param»

count=$(($count+1))

done

Вызовем этот скрипт в таком виде:

./myscript -a -b test1 -d

1 .myscript-a-btest1-d

Посмотрим на результаты его работы.

Обработка параметров ключей

В данном примере в конструкции 
case обрабатываются три ключа. Ключ 
-b требует наличия дополнительного параметра. Так как обрабатываемый ключ находится в переменной 
$1, соответствующий ему параметр будет находиться в 
$2 (тут используется команда 
shift, поэтому, по мере обработки, всё, что передано сценарию, сдвигается влево). Когда с этим мы разобрались, осталось лишь извлечь значение переменной 
$2 и у нас будет параметр нужного ключа. Конечно, тут понадобится ещё одна команда 
shift для того, чтобы следующий ключ попал в 
$1.

Команда shift

Использовать команду в bash-скриптах следует с осторожностью, так как она, в прямом смысле слова, сдвигает значения позиционных параметров

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

Обратите внимание на то, что при этом значение переменной , содержащей имя скрипта, не меняется

Воспользовавшись командой , рассмотрим ещё один способ перебора переданных скрипту параметров:

Скрипт задействует цикл , проверяя длину значения первого параметра. Когда длина станет равна нулю, происходит выход из цикла. После проверки первого параметра и вывода его на экран, вызывается команда , которая сдвигает значения параметров на одну позицию.

Использование команды shift для перебора параметров

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

Обработка ключей со значениями

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

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

Вызовем этот скрипт в таком виде:

Посмотрим на результаты его работы.

Обработка параметров ключей

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: