Bash: цикл for c описанием и примерами

Объединение команд

Оболочка 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

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
2
3
4

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#!/bin/bash
# A simple menu system
 

names=’Kyle Cartman Stan Quit’

PS3=’Select character: ‘

select name in$names

do

if$name==’Quit’

then
break
fi

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 в блокноте, стоит выполнить следующие действия:

  1. Щелкнуть Пуск.
  2. Ввести Блокнот в поле «Выполнить» и нажмите Enter. Также можно использовать любой аналогичный редактор текстовых элементов, например Notepad ++.
  3. Когда Блокнот откроется, ввести следующие строчки или скопировать и вставить их.
  4. Щелкнуть «Файл», затем «Сохранить» и перейти в папку, в которой нужно сохранить. В качестве имени можно ввести test.bat. Если в версии операционной системы есть параметр «Сохранить как», выбрать «Все файлы», в противном случае он сохраняется как текстовый. Выполнив эти шаги, нажать кнопку «Сохранить» и выйти из блокнота.
  5. Чтобы запустить документ, следует дважды щелкнуть на него. Окно CMD откроется автоматически с желаемым выходом. После завершения выполнения, окно автоматически закрывается.
  6. Можно попробовать добавить функцию echo on в шаг 2, чтобы посмотреть, что происходит на каждой строчке.

Шаги для создания скриптов практически одинаковы, независимо от того, установлена версия Windows 10, 8.1, 7 или даже XP.

Стоит обратить внимание, что можно использовать расширение cmd вместо расширения bat

Создание bat-файла в MS-DOS

Чтобы создать пакетный элемент в MS-DOS или командной строке Windows, важно выполнить следующие действия:

  1. Открыть командное окно MS-DOS или загрузить MS-DOS.
  2. В строке MS-DOS ввести: edit test.bat и нажать Enter.
  3. Если введено все правильно, появится синий экран редактирования.
  4. После ввода этих строчек щелкнуть «Файл» и выбрать «Выход». Когда будет предложено сохранить элемент, нажать «Да». Пользователи, у которых нет мыши, могут выполнить эту же задачу, нажав Alt + F для доступа к меню, а затем X для выхода. Нажать Enter, чтобы сохранить изменения.
  5. Вернувшись к приглашению 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:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *