Bash: цикл for c описанием и примерами
Содержание:
- Объединение команд
- Привет, мир, используя переменные
- 10.2 Арифметические вычисления
- 11.5 Полезные команды
- 14.2 Переводы
- Three-expression bash for loops syntax
- Работа с внешними программами при написании shell-скриптов
- 4.2 Файлы начальных действий оболочки
- Команды Bash
- 6.1 Просто теория
- 10.3 Поиск bash
- Select
- Examples
- Conditional exit with break
- 4.5 Встроенная команда set.
- Создание bat-скрипта в Windows
- Основы скриптов
- Command-line arguments
Объединение команд
Оболочка Bash позволяет не только выполнять команды, но и объединять их в сложные конструкции для получения нужного эффекта. Использование Bash таким способом очень эффективно. Как вы знаете, система Linux создает три потока для каждой программы — поток ввода, поток вывода и поток ошибок. Оболочка позволяет перенаправить поток одной программы прямо в другую с помощью специальных операторов. Читайте более подробно обо всем этом в статье перенаправление ввода вывода в Bash.
Кроме того, Bash позволяет объединять команды по времени выполнения. Существуют такие операторы для объединения команд:
- && — выполнить первую команду, а вторую выполнять только если первая завершится успешно;
- || — выполнить первую команду, а вторую выполнять только если первая завершится неудачей;
- ; — выполняет последовательно каждую следующую команду, как только завершится предыдущая;
- & — запустить команду в фоне и сразу же вернуть управление в командную оболочку для выполнения следующей команды.
Например, сначала выполняем загрузку файла, а затем открываем его в плеере, если загрузка прошла успешно:
Чтобы продолжить этот пример, мы можем удалить загруженный файл, если произошла ошибка:
Чтобы выполнить обновление системы, а затем завершить работу выполните:
И наконец, вы можете запустить какой-либо сервис или приложение, например, браузер в фоне и свободно продолжить работу в терминале:
Управляющие символы Bash
Перенаправление вывода, организация тоннелей и поочередное выполнение команд — это очень хорошо, но у Bash есть еще и другие полезные возможности. Например, с помощью специальных символов вы можете модифицировать команды, искать в истории и многое другое.
Чтобы вставить в положение курсора предыдущую команду напишите !!. Например, чтобы выполнить последнюю команду с sudo достаточно выполнить:
Чтобы выполнить не последнюю команду, а скажем, предпоследнюю или выполненную еще раньше, то после восклицательного знака нужно указать ее номер:
Если вы укажите один восклицательный знак и несколько символов, то выполнится последняя команда, которая начиналась на эти символы:
Также может понадобиться искать команду не по первому символу, а по вхождению в нее определенного набора символов. Тогда можно использовать такую конструкцию. Ищем последнюю команду, в которой встречалось tmp:
Если перед командой написать пробел, то она не сохранится в истории:
Символ $? позволяет вывести код завершения последней команды:
Символ звездочки возвращает массивом содержимое текущей папки:
С помощью символа ^ можно заменить несколько букв из предыдущей команды. Работает это вот так:
В результате файл будет удален.
Привет, мир, используя переменные
Создайте новый файл со следующим содержимым и дайте ему исполняемые разрешения с помощью .
Это приведет к печати до стандартного вывода при его выполнении.
Чтобы сообщить bash, где сценарий вам нужен, нужно указать его в содержащую директорию, обычно с если это ваш рабочий каталог, где является псевдонимом текущего каталога. Если вы не укажете каталог, попытается найти скрипт в одном из каталогов, содержащихся в среды .
Следующий код принимает аргумент , который является первым аргументом командной строки, и выводит его в отформатированной строке, следующей за .
Важно отметить, что должен быть указан в двойной кавычки, а не одинарной кавычки. по желанию расшифровывается до первого аргумента командной строки, а вычисляется до литеральной строки
10.2 Арифметические вычисления
В командной строке (или оболочке) попробуйте ввести следующее:
echo 1 + 1
Если Вы рассчитываете увидеть ‘2’, то будете разочарованы.
Что следует выполнить, если возникает необходимость, чтобы BASH произвёл вычисления
над Вашими числами? Решение заключается в следующем:
echo $((1+1))
В результате этого вывод будет более «логичным». Такая запись
используется для вычисления арифметических выражений. Вы также
можете выполнить это следующим образом:
echo $
Если Вам необходимо использовать дроби или более сложную математику, то
можно использовать bc для вычисления арифметических выражений.
Когда автор запустил «echo $[3/4]» в командной оболочке, она вернула
значение 0. Это связано с тем, что если bash отвечает, он использует только целые значения.
Если Вы запустите «echo 3/4|bc -l», оболочка вернёт правильное
значение 0.75.
11.5 Полезные команды
Этот раздел переписал Kees (смотрите раздел «Благодарность»).
Некоторые из этих команд практически содержат полноценные командные
языки. Здесь объясняются только основы таких команд. Для более подробной
информации внимательно просмотрите man-страницы каждой команды.
sed (потоковый редактор)
Sed — это неинтерактивный редактор. Вместо того, чтобы
изменять файл движением курсора на экране, следует использовать
сценарий инструкций по редактированию для sed, а также имя
редактируемого файла. Вы также можете рассматривать sed в качестве
фильтра. Посмотрите на некоторые примеры:
Sed заменяет строку ‘to_be_replaced’ строкой ‘replaced’, читая файл
/tmp/dummy . Результат отправляется на стандартный вывод (обычно, на консоль),
но Вы также можете добавить ‘> capture’ в вышеуказанную строку,
чтобы sed отправлял вывод в файл ‘capture’.
Sed отображает все строки, за исключением строк с 12 по 18. Исходный
файл этой командой не изменяется.
awk (манипулирование файлами данных, выборка и обработка текста)
Существует большое количество реализаций языка программирования AWK (наиболее
распространенными интерпретаторами являются gawk из проекта GNU и «новый awk» mawk.)
Принцип достаточно прост: AWK находится в поиске шаблона; для каждого подходящего шаблона
выполняется какое-нибудь действие.
Автор повторно создал файл dummy, содержащий следующие строки:
«test123
test
tteesstt»
test123
test
Шаблон, искомый AWK, это ‘test’, а действие, выполняемое AWK
при обнаружении строки в /tmp/dummy с подстрокой ‘test’, это ‘print’.
3
Если Вы находитесь в поиске нескольких шаблонов, замените текст между кавычками на
‘-f file.awk’. В этом случае, Вы можете записать все шаблоны и
действия в файле ‘file.awk’.
grep (выводит строки, соответствующие искомому шаблону)
Мы рассматривали несколько команд grep в предыдущих главах,
которые отображали строки, соответствующие шаблону. Однако grep способен выполнять
значительно большее.
12
Строка «look for this» была обнаружена 12 раз в файле /var/log/messages.
[ok, данный пример был фикцией, /var/log/messages был переделан :-)]
wc (считает строки, слова и байты)
В следующем примере можно заметить, что выводится не то, что мы ожидаем.
В этом случае, файл dummy содержит следующий текст:
«bash introduction
howto test file»
2 5 34 /tmp/dummy
wc не заботится о порядке параметров. Он всегда выводит их в
стандартном порядке:
<число строк><число слов><число байтов><имя файла>.
sort (сортирует строки текстового файла)
В этом случае, файл dummy содержит следующий текст:
«b
c
a»
Вывод выглядит следующим образом:
a
b
c
Команды не должны быть такими простыми 🙂
bc (вычислительный язык программирования)
bc производит вычисления с командной строки
(ввод из файла, но не через перенаправление или конвейер),
а также из пользовательского интерфейса. Следующий пример
показывает некоторые команды
Обратите внимание, что автор использовал
bc с параметром -q, чтобы отказаться от вывода сообщения с
приглашением.
1 == 5
0.05 == 0.05
1
5 != 5
2 ^ 8
256
sqrt(9)
3
while (i != 9) {
i = i + 1;
print i
}
123456789
quit
tput (инициализирует терминал или запрашивает базу данных terminfo)
Небольшая иллюстрация возможностей tput:
Приглашение командной строки появится в координатах (y10,x4).
Экран очищается и приглашение появляется в (y1,x1)
Обратите внимание, что
(y0,x0) — это левый верхний угол.. 80
80
Отображает возможное количество символов в направлении по оси x.
Настоятельно рекомендуется быть с этими программами на «ты» (как минимум).
Существует огромное количество небольших программ, которые предоставляют Вам возможность заняться
настоящей магией в командной строке.
14.2 Переводы
Итальянский: Вильям Гельфи (William Ghelfi, wizzy at tiscalinet.it),
http://web.tiscalinet.it/penguin_rules.
Французский: Лорент Мартелли (Laurent Martelli),
is missed.
Корейский: Минсок Парк (Minseok Park),
http://kldp.org.
Корейский: Чхун Хе Чин (Chun Hye Jin),
unknown.
Испанский: Габриэль Родригес Альберич (Gabriel Rodri’guez Alberich),
http://www.insflug.org.
Нидерландский: Эллен Бокхорст (Ellen Bokhorst),
http://nl.linux.org/.
Словенский: Андрей Лайовиц (Andrej Lajovic),
http://www.lugos.si/.
По мнению автора, существуют другие переводы. Однако у него отсутствует какая-либо
касающиеся их информация; если у Вас она имеется, отправьте её автору и он обновит этот раздел.
Three-expression bash for loops syntax
This type of for loop share a common heritage with the C programming language. It is characterized by a three-parameter loop control expression; consisting of an initializer (EXP1), a loop-test or condition (EXP2), and a counting expression/step (EXP3).
for (( EXP1; EXP2; EXP3 )) do command1 command2 command3 done ## The C-style Bash for loop ## for (( initializer; condition; step )) do shell_COMMANDS done |
A representative three-expression example in bash as follows:
#!/bin/bash for (( c=1; c<=5; c++ )) do echo "Welcome $c times" done |
Sample output:
Welcome 1 times Welcome 2 times Welcome 3 times Welcome 4 times Welcome 5 times
Работа с внешними программами при написании shell-скриптов
Для начала немного полезной теории.
Перенаправление потоков.
В bash (как и многих других оболочках) есть встроенные файловые дескрипторы: , , . — Стандартный вывод. Сюда попадает все что выводят программы — Стандартный ввод. Это все что набирает юзер в консоли — Стандартный вывод ошибок.
Для операций с этими дескрипторами, существуют специальные символы: (перенаправление вывода), (перенаправление ввода). Оперировать ими не сложно. Например:
или
Если есть необходимость дописывать в файл(при использовании «» он заменятеся), необходимо вместо «» использовать «»
после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры.
Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать:
цифра 2 перед «» означает что нужно перенаправлять все что попадет в дескриптор 2(stderr).
Если необходимо заставить писать в , то это можно след. образом:
символ «» означает указатель на дескриптор
(Поумолчанию пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)).
2. Конвееры.
Конвеер — очень мощный инструмент для работы с консолью Bash. Синтаксис простой: — означает, что вывод команды 1 передастся на ввод команде 2
Конвееры можно группировать в цепочки и выводить с помощью перенаправления в файл, например:
вывод команды передается команде , которая отбирает все строки, в которых встретится слово hash, и передает команде сортировке , которая пишет результат в файл sorting_list. Все довольно понятно и просто.
Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке одной команды и передача на другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты.
1. Передача вывода в переменную.
Для того чтобы записать в переменную вывод какой-либо команды, достаточно заключить команду в ковычки, например
Результат работы: qwerty
Однако если вы захотите записать в переменную список директорий, то необходимо, должным образом обработать результат для помещения данных в переменную. Рассмотрим небольшой, пример:
Здесь мы используем цикл для архивирование всех директорий в папке /svn/ с помощью команды (что в нашем случае не имеет никого значения, просто как пример). Наибольшй интерес вызывает строка: LIST= В ней переменной LIST присваивается выполнение команды find, обработанной командами awk, sort, uniq,tr(все эти команды мы рассматривать не будем, ибо это отдельная статья). В переменной LIST будут имена всех каталогов в папке /svn/ пгомещенных в одну строку(для того чтобы её стравить циклу.
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 расширяется, и этот файл
используется в качестве источника; другие файлы начальных действий не
считываются.
Команды Bash
Основу работы в Bash составляют команды. Именно с помощью команд вы будете выполнять большинство действий над системой. Команды можно поделить на два типа. Это встроенные в оболочку, которые существуют только виртуально, мы рассматривали их в статье основные команды Bash, а также внешние команды — обычные утилиты или скрипты, расположенные в файловой системе.
Возвращаясь к встроенным командам, можно привести пример, вы не найдете в файловой системе команду cd. Ее нет, она встроена.
Обычные же команды находятся в файловой системе. Они могут находиться в одной из папок, указанных в переменной PATH. Для выполнения встроенной или внешней команды достаточно набрать ее имя, интерпретатор отлично справляется с поиском команд по папкам, указанным в PATH. Например:
Но если команда находится в одной из сторонних папок, то необходимо ввести ее полный адрес:
Иначе оболочка не сможет найти исполняемый файл команды.
6.1 Просто теория
Существует большое количество форм условных операторов. Элементарная форма — это
if выражение then оператор,
где ‘оператор’ выполняется только в том случае, если
‘выражение’ имеет значение «истина».
‘2<1’ — это выражение, имеющее значение «ложь», в то время как ‘2>1’
— «истина».
Существуют другие формы условных операторов, такие как:
if выражение
then оператор1 else оператор2.
Здесь ‘оператор1’ выполняется, если ‘выражение’- истина; в противном случае,
выполняется ‘оператор2’.
Ещё одной формой условных операторов является:
if выражение1
then оператор1
else if выражение2 then оператор2
else оператор3.
В данной форме добавляется только последовательность
«ELSE IF ‘выражение2’ THEN ‘оператор2′»,
заставляющая ‘оператор2’ выполняться, если
‘выражение2’ имеет значение «истина». Всё остальное соответствует Вашему представлению
об этом (см. предыдущие формы).
Несколько слов о синтаксисе:
Элементарная конструкция оператора ‘if’ в bash выглядит следующим образом:
if ;
then
code if ‘выражение’ is true.
fi
10.3 Поиск bash
Из сообщения от mike (смотрите раздел «Благодарность»):
Вы всегда используете #!/bin/bash .. Вы могли бы привести пример, каким образом
можно обнаружить, где расположен bash.
Предпочтительнее использовать ‘locate bash’, но locate имеется не на всех машинах.
‘find ./ -name bash’ из корневого каталога обычно срабатывает.
Можно проверить следующие расположения:
ls -l /bin/bash
ls -l /sbin/bash
ls -l /usr/local/bin/bash
ls -l /usr/bin/bash
ls -l /usr/sbin/bash
ls -l /usr/local/sbin/bash
(автор не способен сразу придумать какой-либо другой каталог…
Он находил bash в большинстве этих мест на различных системах).
Вы также можете попробовать ‘which bash’.
Select
Механизм select позволяет вам создать простую систему меню. Он имеет следующий формат:
Shell
select var in <list>
do
<commands>
done
1 |
select varin<list> do <commands> done |
При вызове он принимает все элементы в list (аналогично другим циклам, это набор разделенных пробелом элементов) и представляет их на экране с номером перед каждым элементом. После этого будет напечатано приглашение, позволяющее пользователю выбрать номер. Когда они выберите номер и нажмите ввести соответствующий пункт будет присвоен переменным var и команды между делать и делать выполняется. После завершения запроса будет отображаться снова, чтобы пользователь мог выбрать другую опцию.
Несколько замечаний:
- Проверка ошибок не выполняется. Если пользователь вводит нечто, отличное от числа или числа, не соответствующего элементу, тогда var становится null (пустой)
- Если пользователь нажимает кнопку ввода без ввода каких-либо данных, список параметров будет отображаться снова.
- Цикл завершится, когда будет введен сигнал EOF или выдается оператор break.
- Вы можете изменить системную переменную PS3, чтобы изменить отображаемое приглашение.
Вот простой пример, иллюстрирующий его использование:
select_example.sh
Shell
#!/bin/bash
# A simple menu system
names=’Kyle Cartman Stan Quit’
PS3=’Select character: ‘
select name in $names
do
if
then
break
fi
echo Hello $name
done
echo Bye
1 |
#!/bin/bash names=’Kyle Cartman Stan Quit’ PS3=’Select character: ‘ select name in$names do if$name==’Quit’ then echoHello$name done echoBye |
Давайте разберем это:
Строка 4 — настройка переменной со списком символов и последней опцией, которую мы можем выбрать для выхода. Обратите внимание, что элементы разделяются пробелом.
Строка 6 — Измените значение системной переменной PS3 так, чтобы в подсказке было что-то более подробное описание. (По умолчанию это #?)
Строки 10 — 13 — Если последний вариант, «Break», выбирается затем break из select цикла.
Строка 14 — Распечатайте сообщение, чтобы продемонстрировать, что механизм работал. У вас может быть так много команд здесь, как вам нравится.
Строка 17 — Распечатайте сообщение, чтобы показать, что сценарий продолжался как обычно после цикла выбора.
И теперь давайте запустим скрипт Bash:
Examples
#!/bin/bash for i in 1 2 3 4 5 do echo "Welcome $i times" done |
Sometimes you may need to set a step value (allowing one to count by two’s or to count backwards for instance). Latest bash version 3.0+ has inbuilt support for setting up ranges:
#!/bin/bash for i in {1..5} do echo "Welcome $i times" done |
Bash v4.0+ has inbuilt support for setting up a step value using {START..END..INCREMENT} syntax:
#!/bin/bash echo "Bash version ${BASH_VERSION}..." for i in {..10..2} do echo "Welcome $i times" done |
Sample outputs:
Bash version 4.0.33(0)-release... Welcome 0 times Welcome 2 times Welcome 4 times Welcome 6 times Welcome 8 times Welcome 10 times
The seq command to create standard bash for Loop (outdated method)
WARNING! The seq command print a sequence of numbers and it is here due to historical reasons. The following examples is only recommend for older bash version. All users (bash v3.x+) are recommended to use the above syntax.
The seq command can be used as follows. A representative example in seq is as follows:
#!/bin/bash for i in $(seq 1 2 20) do echo "Welcome $i times" done |
There is no good reason to use an external command such as seq to count and increment numbers in the for loop, hence it is recommend that you avoid using seq. The builtin command are fast.
Conditional exit with break
You can do early exit with break statement inside the for loop. You can exit from within a FOR, WHILE or UNTIL loop using break. General break statement inside the for loop:
for I in 1 2 3 4 5 do statements1 #Executed for all values of ''I'', up to a disaster-condition if any. statements2 if (disaster-condition) then break #Abandon the loop. fi statements3 #While good and, no disaster-condition. done |
Following shell script will go though all files stored in /etc directory. The for loop will be abandon when /etc/resolv.conf file found.
#!/bin/bash for file in etc/* do if "${file}" == "/etc/resolv.conf" then countNameservers=$(grep -c nameserver etcresolv.conf) echo "Total ${countNameservers} nameservers defined in ${file}" break fi done |
Early continuation with continue statement
To resume the next iteration of the enclosing FOR, WHILE or UNTIL loop use continue statement.
for I in 1 2 3 4 5 do statements1 #Executed for all values of ''I'', up to a disaster-condition if any. statements2 if (condition) then continue #Go to next iteration of I in the loop and skip statements3 fi statements3 done |
This script make backup of all file names specified on command line. If .bak file exists, it will skip the cp command.
#!/bin/bash FILES="$@" for f in $FILES do # if .bak backup file exists, read next file if -f ${f}.bak then echo "Skiping $f file..." continue # read next file and skip the cp command fi # we are here means no backup file exists, just use cp command to copy file bincp $f $f.bak done |
4.5 Встроенная команда set.
Зта встроенная команда настолько перегружена, что ей посвящается целый раздел.
- -a
-
отмечает переменные, которые модифицированы или созданы для зкспорта.
- -b
-
вызывает прекращение фоновых заданий, о котором сообщает перед
выводом следующего базового приглашения. - -е
-
немедленный выход, если выходное состояние команды ненулевое.
- -f
-
выключает генерацию имени файла (глоббирование).
- -h
-
обнаруживает и запоминает (хеширует) команды как определенные
функции до того, как функция будет выполнена. - -к
-
В окружении команды располагаются все аргументы ключевых слов,
не только те, которые предшествуют имени команды. - -m
-
Разрешается управление заданиями (см. главу 5).
- -n
-
Читает команды, но не выполняет их.
- -о имя_опции
-
Устанавливает флаг, соответствующий имени_опции.
- allexport
-
то же, что -а.
- braceexpand
-
оболочка должна выполнить brace-расширение (см.
раздел 2.2). - emacs
-
использует интерфейс редактирования emacs (см. главу
7 «Редактирование командной строки»). - errexit
-
то же, что -е.
- histexpand
-
то же, что -Н.
- ignoreeof
-
оболочка не выходит при чтении EOF.
- interactive-comments
-
позволяет вызывать слово, начинающееся с ‘#’, и все
оставшиеся символы на этой строке игнорировать в диа логовой оболочке. - monitor
-
то же, что -m.
- noclobber
-
то же, что -C.
- noexec
-
то же, что -n.
- noglob
-
то же, что -f.
- nohash
-
то же, что -d.
- notify
-
то же, что -b.
- nounset
-
то же, что -u.
- physical
-
то же, что -P.
- posix
-
изменяет режим Bash в соответствии со стандартом
Posix 1003.2, когда операция по умолчанию отличается
от него. Предназначен для того, чтобы сделать режим
строго подчиненным зтому стандарту. - privileged
-
то же, что -p.
- verbose
-
то же, что -v.
- vi
-
использует интерфейс редактирования строки редактора
vi. - xtrace
-
то же, что -x.
- -p
-
Включает привилегированный режим. В зтом режиме файл $ENV не
выполняется, и функции оболочки не наследуются из среды. Зто
включается автоматически начальными действиями, если идентификатор зффективного пользователя (группы) не равен идентификатору реального пользователя (группы). Выключение зтой опции присваивает идентификатор зффективного пользователя (группы) идентификатору реального пользователя (группы). - -t
-
выход после чтения и выполнения команды.
- -u
-
во время замещения рассматривает незаданную переменную как ошибку.
- -v
-
выдает строки ввода оболочки по мере их считывания.
- -x
-
выводит команды и их аргументы по мере выполнения команд.
- -l
-
сохраняет и восстанавливает связывание имени в команде for.
- -d
-
Выключает хеширование команд, найденных для выполнения. Обычно
команды запоминаются в хеш-таблице и, будучи однажды найденными, больше не ищутся. - -С
-
не позволяет существующим файлам перенаправление вывода.
- -Н
-
закрывает замену стиля ! истории. Этот флаг принимается по умолчанию.
- -Р
-
Если установлена, не следует символьному указателю при выполнении команды типа cd, которая изменяет текущий каталог. Вместо
этого используется физический каталог. - —
-
Если нет аргументов, следующих за зтим флагом, то не задаются позиционные параметры. В противном случае позиционные параметры
присваиваются аргументам, даже если некоторые из них начинаются с а-. - —
-
Сигнал конца опции, вызывающей присваивание оставшихся аргументов
позиционным параметрам. Опции -x и -v выключаются. Если здесь
нет аргументов, позиционный параметр не изменяется.
Создание bat-скрипта в Windows
В Windows можно создать командный файл, используя шаги ниже или шаги, упомянутые в разделе командной строки MS-DOS. Если удобно использовать стандартные программы, можно воспользоваться любым текстовым редактором (например, Блокнот или WordPad) для создания пакетных документов.
Для того чтобы создать скрипт с расширением bat в блокноте, стоит выполнить следующие действия:
- Щелкнуть Пуск.
- Ввести Блокнот в поле «Выполнить» и нажмите Enter. Также можно использовать любой аналогичный редактор текстовых элементов, например Notepad ++.
- Когда Блокнот откроется, ввести следующие строчки или скопировать и вставить их.
- Щелкнуть «Файл», затем «Сохранить» и перейти в папку, в которой нужно сохранить. В качестве имени можно ввести test.bat. Если в версии операционной системы есть параметр «Сохранить как», выбрать «Все файлы», в противном случае он сохраняется как текстовый. Выполнив эти шаги, нажать кнопку «Сохранить» и выйти из блокнота.
- Чтобы запустить документ, следует дважды щелкнуть на него. Окно CMD откроется автоматически с желаемым выходом. После завершения выполнения, окно автоматически закрывается.
- Можно попробовать добавить функцию echo on в шаг 2, чтобы посмотреть, что происходит на каждой строчке.
Шаги для создания скриптов практически одинаковы, независимо от того, установлена версия Windows 10, 8.1, 7 или даже XP.
Стоит обратить внимание, что можно использовать расширение cmd вместо расширения bat
Создание bat-файла в MS-DOS
Чтобы создать пакетный элемент в MS-DOS или командной строке Windows, важно выполнить следующие действия:
- Открыть командное окно MS-DOS или загрузить MS-DOS.
- В строке MS-DOS ввести: edit test.bat и нажать Enter.
- Если введено все правильно, появится синий экран редактирования.
- После ввода этих строчек щелкнуть «Файл» и выбрать «Выход». Когда будет предложено сохранить элемент, нажать «Да». Пользователи, у которых нет мыши, могут выполнить эту же задачу, нажав Alt + F для доступа к меню, а затем X для выхода. Нажать Enter, чтобы сохранить изменения.
- Вернувшись к приглашению MS-DOS, ввести: test и нажать Enter, чтобы выполнить test.bat. Поскольку первая строчка представляет собой паузу, сначала будет предложено нажать клавишу. После этого документ запускается построчно. В этом случае будет произведено перечисление элементов в каталогах Windows и Windows \ system.
Полезно обратить внимание: если есть необходимость добавить больше строчек в пакетный элемент, достаточно ввести edit test.bat, чтобы открыть его для редактирования. Некоторые версии MS-DOS и загрузочных дискет могут не иметь директивы редактирования
Если это так, нужно либо ввести edit.com, либо использовать функцию copy con.
Основы скриптов
Скрипт или как его еще называют — сценарий, это последовательность команд, которые по очереди считывает и выполняет программа-интерпретатор, в нашем случае это программа командной строки — bash.
Скрипт — это обычный текстовый файл, в котором перечислены обычные команды, которые мы привыкли вводить вручную, а также указанна программа, которая будет их выполнять. Загрузчик, который будет выполнять скрипт не умеет работать с переменными окружения, поэтому ему нужно передать точный путь к программе, которую нужно запустить. А дальше он уже передаст ваш скрипт этой программе и начнется выполнение.
Простейший пример скрипта для командной оболочки Bash:
Утилита echo выводит строку, переданную ей в параметре на экран. Первая строка особая, она задает программу, которая будет выполнять команды. Вообще говоря, мы можем создать скрипт на любом другом языке программирования и указать нужный интерпретатор, например, на python:
Или на PHP:
В первом случае мы прямо указали на программу, которая будет выполнять команды, в двух следующих мы не знаем точный адрес программы, поэтому просим утилиту env найти ее по имени и запустить. Такой подход используется во многих скриптах. Но это еще не все. В системе Linux, чтобы система могла выполнить скрипт, нужно установить на файл с ним флаг исполняемый.
Этот флаг ничего не меняет в самом файле, только говорит системе, что это не просто текстовый файл, а программа и ее нужно выполнять, открыть файл, узнать интерпретатор и выполнить. Если интерпретатор не указан, будет по умолчанию использоваться интерпретатор пользователя. Но поскольку не все используют bash, нужно указывать это явно.
Чтобы сделать файл исполняемым в linux выполните:
Теперь выполняем нашу небольшую первую программу:
Все работает. Вы уже знаете как написать маленький скрипт, скажем для обновления. Как видите, скрипты содержат те же команды, что и выполняются в терминале, их писать очень просто. Но теперь мы немного усложним задачу. Поскольку скрипт, это программа, ему нужно самому принимать некоторые решения, хранить результаты выполнения команд и выполнять циклы. Все это позволяет делать оболочка Bash. Правда, тут все намного сложнее. Начнем с простого.
Command-line arguments
A command line argument is nothing but an argument sent to a program being called. A program can take any number of command line arguments. For example, we are going to use the grep command to search for user names in the /etc/passwd file: grep is the name of an actual command and shell executed this command when you type command at shell prompt. The first word on the command line is:
- grep – name of the command to be executed.
- Everything else on command line is taken as arguments to this command.
The for Loop argument list also accpents Command-line arguments/paramenters as follows:
## $@ expands to the positional parameters, starting from one. ## for i in $@ do echo "Script arg is $i" done |
You run it as follows: