Фундаментальные основы Linux. Часть VI. Сценарии
Оригинал:
Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 21 декабря 2014 г.
Глава 21. Введение в разработку сценариев
Командные оболочки, такие, как bash
и Korn shell
поддерживают программные конструкции, которые могут быть сохранены в форме сценариев. Эти сценарии
, в свою очередь, впоследствии могут использоваться в качестве реализаций дополнительных команд командной оболочки
. Многие команды Linux реализованы в форме сценариев
. Например, сценарии для обслуживания профиля пользователя
исполняются при входе пользователя в систему, а сценарии инициализации
— при остановке и запуске демона
.
Исходя из вышесказанного, системные администраторы также должны иметь базовое представление о сценариях командной оболочки
для понимания того, как функционируют их серверы, запускаются, обновляются, исправляются, поддерживаются, настраиваются и удаляются их приложения, а также для понимания устройства программного окружения.
Целью данной главы является предоставление достаточной информации для того, чтобы вы могли читать и понимать сценарии. Для этого вам совершенно не нужно становиться разработчиком сложных сценариев.
Предварительное чтение
Перед тем, как приступить к чтению данной главы, вам необходимо прочитать и понять главы из Части III. "Раскрытие команд командной оболочкой"
и Части IV. "Программные каналы и команды"
.
Hello world
По аналогии с практически любым курсом по программированию, мы начнем работу с разработки сценария hello_world
. Следующий сценарий будет выводить строку Hello World
.
echo Hello World
После создания этого простого сценария в редакторе vi
или с помощью команды echo
вам придется выполнить команду chmod +x hello_world
для того, чтобы сделать файл сценария исполняемым. В том случае, если вы не будете добавлять путь к директории с вашими сценариями в список директорий из переменной окружения PATH, вам придется вводить полный путь к сценарию для того, чтобы командная оболочка смогла найти его.
[paul@RHEL4a ~]$ echo echo Hello World > hello_world [paul@RHEL4a ~]$ chmod +x hello_world [paul@RHEL4a ~]$ ./hello_world Hello World [paul@RHEL4a ~]$
She-bang
Давайте немного доработаем наш пример, разместив строку #!/bin/bash
в начале сценария. Последовательность символов #!
называется she-bang
(или иногда sha-bang
), причем слово she-bang
составлено из названий двух первых символов сценария.
#!/bin/bash echo Hello World
Вы ни при каких обстоятельствах не можете быть уверены в том, какая командная оболочка используется в системе пользователя. Сценарий, превосходно работающий в командной оболочке bash
, может не работать в командных оболочках ksh
, csh
или dash
. Для того, чтобы проинструктировать командную оболочку о необходимости запуска вашего сценария в определенной командной оболочке, вы должны начинать ваш сценарий с последовательности символов she-bang
, после которой должен располагаться путь к бинарному файлу командной оболочки, в которой сценарий должен исполняться. Приведенный ниже сценарий будет исполняться в командной оболочке bash.
#!/bin/bash echo -n hello echo Дочерняя командная оболочка bash `echo -n hello`
А этот сценарий будет исполняться в командной оболочке Korn shell (за исключением тех случаев, когда по пути /bin/ksh
расположена жесткая ссылка на бинарный файл /bin/bash
). Файл /etc/shells
содержит список путей к командным оболочкам, установленным в вашей системе.
#!/bin/ksh echo -n hello echo Дочерняя командная оболочка Korn shell `echo -n hello`
Комментарий
Давайте еще немного усовершенствуем наш пример, добавив строки комментариев.
#!/bin/bash # # Сценарий Hello World # echo Hello World
Переменные
Ниже приведен простой пример объявления переменной в сценарии.
#!/bin/bash # # простая переменная в сценарии # var1=4 echo var1 = $var1
Сценарии могут содержать переменные, но ввиду того, что сценарии исполняются в своих собственных экземплярах командных оболочек, переменные не смогут пережить момент завершения исполнения сценария.
[paul@RHEL4a ~]$ echo $var1 [paul@RHEL4a ~]$ ./vars var1 = 4 [paul@RHEL4a ~]$ echo $var1 [paul@RHEL4a ~]$
Использование рабочей командной оболочки
К счастью, у вас имеется возможность исполнения сценария в той же рабочей командной оболочке; данная техника называется использованием рабочей командной оболочки
(sourcing a script
).
[paul@RHEL4a ~]$ source ./vars var1 = 4 [paul@RHEL4a ~]$ echo $var1 4 [paul@RHEL4a ~]$
Представленная выше команда аналогична следующей команде.
[paul@RHEL4a ~]$ . ./vars var1 = 4 [paul@RHEL4a ~]$ echo $var1 4 [paul@RHEL4a ~]$
Отладка сценария
Другой способ исполнения сценария в отдельной командной оболочке заключается во вводе команды bash
перед именем сценария, которое в этом случае будет передаваться бинарному файлу командной оболочки в качестве параметра.
paul@debian6~/test$ bash runme 42
Дополнение данной команды до формы bash -x
позволит вам ознакомиться со всеми командами, исполняемыми командной оболочкой (после раскрытия команд).
paul@debian6~/test$ bash -x runme + var4=42 + echo 42 42 paul@debian6~/test$ cat runme # сценарий runme var4=42 echo $var4 paul@debian6~/test$
Обратите внимание на отсутствие строки комментария (первым символом которой является символ #), а также замену значения переменной перед исполнением команды для вывода данных echo
.
Предотвращение подмены имен файлов сценариев с целью повышения привилегий в системе
Какой-либо пользователь может попытаться выполнить сценарий с установленным битом setuid
с целью повышения привилегий в системе, подменив имя файла этого сценария путем создания ссылки на него (root spoofing
). Это довольно редкая, но возможная атака. Для повышения безопасности функционирования вашего сценария, а также для предотвращения подмены имен файлов сценариев, вам необходимо добавить после строки #!/bin/bash
параметр --
, который позволит деактивировать механизм обработки параметров, благодаря чему командная оболочка не примет дополнительных параметров.
#!/bin/bash - или #!/bin/bash --
Любые аргументы, расположенные после последовательности символов --
будут рассматриваться как имена файлов и аргументы. Аргумент -
эквивалентен аргументу --
.
Практическое задание: введение в разработку сценариев
-
0. Используйте различные имена для файлов ваших сценариев и сохраните их на будущее!
-
1. Создайте сценарий, который выводит имя города.
-
2. Сделайте так, чтобы сценарий исполнялся в командной оболочке bash.
-
3. Сделайте так, чтобы сценарий исполнялся в командной оболочке Korn shell.
-
4. Создайте сценарий, в котором осуществляется объявление двух переменных с последующим выводом их значений.
-
5. Предыдущий сценарий не должен оказывать воздействия на вашу рабочую командную оболочку (объявленные в нем переменные не будут существовать вне сценария). А теперь запустите сценарий таким образом, чтобы он оказал влияние на вашу рабочую командную оболочку.
-
6. Существует ли более короткая форма команды для
использования рабочей командной оболочки с целью исполнении сценария
? -
7. Добавьте комментарии в ваши сценарии для того, чтобы знать о выполняемых ими операциях.
Корректная процедура выполнения практического задания: введение в разработку сценариев
-
0. Используйте различные имена для файлов ваших сценариев и сохраните их на будущее!
-
1. Создайте сценарий, который выводит имя города.
-
$ echo 'echo Antwerp' > first.bash $ chmod +x first.bash $ ./first.bash Antwerp
-
2. Сделайте так, чтобы сценарий исполнялся в командной оболочке bash.
-
$ cat first.bash #!/bin/bash echo Antwerp
-
3. Сделайте так, чтобы сценарий исполнялся в командной оболочке Korn shell.
-
$ cat first.bash #!/bin/ksh echo Antwerp
Обратите внимание на то, что хотя данный сценарий и будет технически исполняться как сценарий командной оболочки Korn shell, расширение файла .bash может смутить пользователя.
-
4. Создайте сценарий, в котором осуществляется объявление двух переменных с последующим выводом их значений.
-
$ cat second.bash #!/bin/bash var33=300 var42=400 echo $var33 $var42
-
5. Предыдущий сценарий не должен оказывать воздействия на вашу рабочую командную оболочку (объявленные в нем переменные не будут существовать вне сценария). А теперь запустите сценарий таким образом, чтобы он оказал влияние на вашу рабочую командную оболочку.
-
6. Существует ли более короткая форма команды для
использования рабочей командной оболочки с целью исполнении сценария
? -
7. Добавьте комментарии в ваши сценарии для того, чтобы знать о выполняемых ими операциях.
-
$ cat second.bash #!/bin/bash # сценарий для проверки работы механизма использования рабочей командной оболочки # объявление двух переменных var33=300 var42=400 # вывод значений этих переменных echo $var33 $var42
Если вам понравилась статья, поделитесь ею с друзьями:
If you are using any major operating system you are indirectly interacting to shell. If you are running Ubuntu, Linux Mint or any other Linux distribution, you are interacting to shell every time you use terminal. In this article I will discuss about linux shells and shell scripting so before understanding shell scripting we have to get familiar with following terminologies:
- Kernel
- Shell
- Terminal
What is Kernel
The kernel is a computer program that is the core of a computer’s operating system, with complete control over everything in the system. It manages following resources of the Linux system –
- File management
- Process management
- I/O management
- Memory management
- Device management etc.
It is often mistaken that Linus Torvalds has developed Linux OS, but actually he is only responsible for development of Linux kernel.
Complete Linux system = Kernel + GNU system utilities and libraries + other management scripts + installation scripts.
What is Shell
A shell is special user program which provide an interface to user to use operating system services. Shell accept human readable commands from user and convert them into something which kernel can understand. It is a command language interpreter that execute commands read from input devices such as keyboards or from files. The shell gets started when the user logs in or start the terminal.
Linux Shell
Shell is broadly classified into two categories –
- Command Line Shell
- Graphical shell
Command Line Shell
Shell can be accessed by user using a command line interface. A special program called Terminal in linux/macOS or Command Prompt in Windows OS is provided to type in the human readable commands such as “cat”, “ls” etc. and then it is being execute. The result is then displayed on the terminal to the user. A terminal in Ubuntu 16.4 system looks like this –
linux command line
In above screenshot “ls” command with “-l” option is executed.
It will list all the files in current working directory in long listing format.
Working with command line shell is bit difficult for the beginners because it’s hard to memorize so many commands. It is very powerful, it allows user to store commands in a file and execute them together. This way any repetitive task can be easily automated. These files are usually called batch files in Windows and Shell Scripts in Linux/macOS systems.
Graphical Shells
Graphical shells provide means for manipulating programs based on graphical user interface (GUI), by allowing for operations such as opening, closing, moving and resizing windows, as well as switching focus between windows. Window OS or Ubuntu OS can be considered as good example which provide GUI to user for interacting with program. User do not need to type in command for every actions.A typical GUI in Ubuntu system –
GUI Shell
There are several shells are available for Linux systems like –
- BASH (Bourne Again SHell) – It is most widely used shell in Linux systems. It is used as default login shell in Linux systems and in macOS. It can also be installed on Windows OS.
- CSH (C SHell) – The C shell’s syntax and usage are very similar to the C programming language.
- KSH (Korn SHell) – The Korn Shell also was the base for the POSIX Shell standard specifications etc.
Each shell does the same job but understand different commands and provide different built in functions.
Shell Scripting
Usually shells are interactive that mean, they accept command as input from users and execute them. However some time we want to execute a bunch of commands routinely, so we have type in all commands each time in terminal.
As shell can also take commands as input from file we can write these commands in a file and can execute them in shell to avoid this repetitive work. These files are called Shell Scripts or Shell Programs. Shell scripts are similar to the batch file in MS-DOS. Each shell script is saved with .sh file extension eg. myscript.sh
A shell script have syntax just like any other programming language. If you have any prior experience with any programming language like Python, C/C++ etc. it would be very easy to get started with it.
A shell script comprises following elements –
- Shell Keywords – if, else, break etc.
- Shell commands – cd, ls, echo, pwd, touch etc.
- Functions
- Control flow – if..then..else, case and shell loops etc.
Why do we need shell scripts
There are many reasons to write shell scripts:
- To avoid repetitive work and automation
- System admins use shell scripting for routine backups
- System monitoring
- Adding new functionality to the shell etc.
Advantages of shell scripts
- The command and syntax are exactly the same as those directly entered in command line, so programmer do not need to switch to entirely different syntax
- Writing shell scripts are much quicker
- Quick start
- Interactive debugging etc.
Disadvantages of shell scripts
- Prone to costly errors, a single mistake can change the command which might be harmful
- Slow execution speed
- Design flaws within the language syntax or implementation
- Not well suited for large and complex task
- Provide minimal data structure unlike other scripting languages. etc
Simple demo of shell scripting using Bash Shell
If you work on terminal, something you traverse deep down in directories. Then for coming few directories up in path we have to execute command like this as shown below to get to the “python” directory:
It is quite frustrating, so why not we can have a utility where we just have to type the name of directory and we can directly jump to that without executing “cd ../” command again and again. Save the script as “jump.sh”
bash
function
jump()
{
OLDIFS=$IFS
IFS=/
path_arr=($PWD)
IFS=$OLDIFS
local
pos=-1
for
dir
in
"${path_arr[@]}"
do
pos=$[$pos+1]
if
[
"$1"
=
"$dir"
];
then
dir_in_path=${
cwd=$PWD
limit=$[$dir_in_path-$pos-1]
for
((i=0; i<limit; i++))
do
cwd=$cwd/..
done
cd
$cwd
break
fi
done
}
For now we cannot execute our shell script because it do not have permissions. We have to make it executable by typing following command –
$ chmod +x path/to/our/file/jump.sh
Now to make this available on every terminal session, we have to put this in “.bashrc” file.
“.bashrc” is a shell script that Bash shell runs whenever it is started interactively. The purpose of a .bashrc file is to provide a place where you can set up variables, functions and aliases, define our prompt and define other settings that we want to use whenever we open a new terminal window.
Now open terminal and type following command:
$ echo “source ~/path/to/our/file/jump.sh”>> ~/.bashrc
Now open you terminal and try out new “jump” functionality by typing following command-
$ jump dir_name
just like below screenshot:
Resources for learning Bash Scripting
- https://bash.cyberciti.biz/guide/The_bash_shell
- http://tldp.org/LDP/abs/html/
References:
- https://en.wikipedia.org/wiki/Shell_script
- https://en.wikipedia.org/wiki/Shell_(computing)
This article is contributed by Atul Kumar. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
If you are using any major operating system you are indirectly interacting to shell. If you are running Ubuntu, Linux Mint or any other Linux distribution, you are interacting to shell every time you use terminal. In this article I will discuss about linux shells and shell scripting so before understanding shell scripting we have to get familiar with following terminologies:
- Kernel
- Shell
- Terminal
What is Kernel
The kernel is a computer program that is the core of a computer’s operating system, with complete control over everything in the system. It manages following resources of the Linux system –
- File management
- Process management
- I/O management
- Memory management
- Device management etc.
It is often mistaken that Linus Torvalds has developed Linux OS, but actually he is only responsible for development of Linux kernel.
Complete Linux system = Kernel + GNU system utilities and libraries + other management scripts + installation scripts.
What is Shell
A shell is special user program which provide an interface to user to use operating system services. Shell accept human readable commands from user and convert them into something which kernel can understand. It is a command language interpreter that execute commands read from input devices such as keyboards or from files. The shell gets started when the user logs in or start the terminal.
Linux Shell
Shell is broadly classified into two categories –
- Command Line Shell
- Graphical shell
Command Line Shell
Shell can be accessed by user using a command line interface. A special program called Terminal in linux/macOS or Command Prompt in Windows OS is provided to type in the human readable commands such as “cat”, “ls” etc. and then it is being execute. The result is then displayed on the terminal to the user. A terminal in Ubuntu 16.4 system looks like this –
linux command line
In above screenshot “ls” command with “-l” option is executed.
It will list all the files in current working directory in long listing format.
Working with command line shell is bit difficult for the beginners because it’s hard to memorize so many commands. It is very powerful, it allows user to store commands in a file and execute them together. This way any repetitive task can be easily automated. These files are usually called batch files in Windows and Shell Scripts in Linux/macOS systems.
Graphical Shells
Graphical shells provide means for manipulating programs based on graphical user interface (GUI), by allowing for operations such as opening, closing, moving and resizing windows, as well as switching focus between windows. Window OS or Ubuntu OS can be considered as good example which provide GUI to user for interacting with program. User do not need to type in command for every actions.A typical GUI in Ubuntu system –
GUI Shell
There are several shells are available for Linux systems like –
- BASH (Bourne Again SHell) – It is most widely used shell in Linux systems. It is used as default login shell in Linux systems and in macOS. It can also be installed on Windows OS.
- CSH (C SHell) – The C shell’s syntax and usage are very similar to the C programming language.
- KSH (Korn SHell) – The Korn Shell also was the base for the POSIX Shell standard specifications etc.
Each shell does the same job but understand different commands and provide different built in functions.
Shell Scripting
Usually shells are interactive that mean, they accept command as input from users and execute them. However some time we want to execute a bunch of commands routinely, so we have type in all commands each time in terminal.
As shell can also take commands as input from file we can write these commands in a file and can execute them in shell to avoid this repetitive work. These files are called Shell Scripts or Shell Programs. Shell scripts are similar to the batch file in MS-DOS. Each shell script is saved with .sh file extension eg. myscript.sh
A shell script have syntax just like any other programming language. If you have any prior experience with any programming language like Python, C/C++ etc. it would be very easy to get started with it.
A shell script comprises following elements –
- Shell Keywords – if, else, break etc.
- Shell commands – cd, ls, echo, pwd, touch etc.
- Functions
- Control flow – if..then..else, case and shell loops etc.
Why do we need shell scripts
There are many reasons to write shell scripts:
- To avoid repetitive work and automation
- System admins use shell scripting for routine backups
- System monitoring
- Adding new functionality to the shell etc.
Advantages of shell scripts
- The command and syntax are exactly the same as those directly entered in command line, so programmer do not need to switch to entirely different syntax
- Writing shell scripts are much quicker
- Quick start
- Interactive debugging etc.
Disadvantages of shell scripts
- Prone to costly errors, a single mistake can change the command which might be harmful
- Slow execution speed
- Design flaws within the language syntax or implementation
- Not well suited for large and complex task
- Provide minimal data structure unlike other scripting languages. etc
Simple demo of shell scripting using Bash Shell
If you work on terminal, something you traverse deep down in directories. Then for coming few directories up in path we have to execute command like this as shown below to get to the “python” directory:
It is quite frustrating, so why not we can have a utility where we just have to type the name of directory and we can directly jump to that without executing “cd ../” command again and again. Save the script as “jump.sh”
bash
function
jump()
{
OLDIFS=$IFS
IFS=/
path_arr=($PWD)
IFS=$OLDIFS
local
pos=-1
for
dir
in
"${path_arr[@]}"
do
pos=$[$pos+1]
if
[
"$1"
=
"$dir"
];
then
dir_in_path=${
cwd=$PWD
limit=$[$dir_in_path-$pos-1]
for
((i=0; i<limit; i++))
do
cwd=$cwd/..
done
cd
$cwd
break
fi
done
}
For now we cannot execute our shell script because it do not have permissions. We have to make it executable by typing following command –
$ chmod +x path/to/our/file/jump.sh
Now to make this available on every terminal session, we have to put this in “.bashrc” file.
“.bashrc” is a shell script that Bash shell runs whenever it is started interactively. The purpose of a .bashrc file is to provide a place where you can set up variables, functions and aliases, define our prompt and define other settings that we want to use whenever we open a new terminal window.
Now open terminal and type following command:
$ echo “source ~/path/to/our/file/jump.sh”>> ~/.bashrc
Now open you terminal and try out new “jump” functionality by typing following command-
$ jump dir_name
just like below screenshot:
Resources for learning Bash Scripting
- https://bash.cyberciti.biz/guide/The_bash_shell
- http://tldp.org/LDP/abs/html/
References:
- https://en.wikipedia.org/wiki/Shell_script
- https://en.wikipedia.org/wiki/Shell_(computing)
This article is contributed by Atul Kumar. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Хотя все описанные выше команды и возможности, несомненно, полезны для повседневной работы с UNIX, истинная мощь этой операционной системы проявляется при наличии у пользователя способности создавать сценарии оболочки. В этом разделе мы приступим к разработке простой программы оболочки, что позволит приобрести знания и навыки в области ветвления, организации циклов и решения других задач.
Что собой представляет программа оболочки
Сценарием оболочки (или программой оболочки) называется файл, содержащий набор команд. Сценарий оболочки выглядит во многом так же, как и обычный файл UNIX,но содержит команды, которые могут выполняться оболочкой. Хотя здесь в основном будет рассказываться о написании программ для оболочки Korn, процесс написания программ для Bourne и C во многом похож. При желании сделать Korn оболочкой, используемой умолчанию, попросите администратора системы внести для вашей учетной записи соответствующие изменения в отвечающую за оболочку запись в файле /etc/passwd.
Прежде чем приступать к созданию программы оболочки, необходимо усвоить, что программы оболочки не содержат никаких специальных команд, которых нельзя было использовать в командной строке. Фактически любую команду из сценария оболочки можно вводить в командной строке и достигать того же самого результата. Все, что программа оболочки делает, так это избавляет от необходимости вводить одни и те же команды снова и снова всякий раз, когда требуется выполнить какой-то набор команд вместе. Кроме того, программы оболочки очень легко настраивать на регулярный запуск.
Использование переменных оболочки
О том, как переменные оболочки можно применять для настройки среды UNIX, уже рассказывалось в моем блоге. Их часто устанавливают внутри программы оболочки для того, чтобы они сохраняли свои значения на протяжении всего выполнения программы.
В случае запуска программы оболочки вручную переменные оболочки можно устанавливать непосредственно в используемом сеансе; тогда специфицировать их отдельно в программе оболочки нет никакой необходимости. Однако вручную программы оболочки запускаются редко, так как это сводит на нет саму цель применения таких программ.Чаще всего они запускаются в виде одного из заданий cron и потому могут запускаться и из такого сеанса, в котором не все переменные среды установлены правильным образом. За счет присваивания значений переменным оболочки внутри программы можно обеспечивать гарантию того, что при ее выполнении для таких ключевых переменных,как PATH, ORACLE_SID и ORACLE_HOME, будут использоваться корректные значения.
Вычисление выражений с помощью команды test
Для того чтобы писать хорошие сценарии оболочки, нужно обязательно разбираться в применении команды test. В большинстве сценариев используются условные операторы (наподобие if-then, while-do и until-do). Команда test помогает определять,удовлетворяется в таких операторах условие или нет.
В частности, команда test вычисляет выражение, и если условие оказывается истинным, возвращает значение 0, а если нет — тогда значение больше нуля (обычно 1).
Синтаксис команды test выглядит следующим образом:
test выражение
Она может использоваться как сама по себе, так и вместе с конструкциями if, while или until для вычисления любого выражения. Ниже приведен пример:
$ test "ONE" = "one"
Этот оператор просит команду test определить, являются ли строки “ONE” и “one” одинаковыми.
Команду test можно применять неявно (через псевдоним), указывая вместо слова test квадратные скобки:
$ [ "ONE" = "one" ]
Для выяснения того, истинным или ложным у команды test (или ее эквивалента с квадратными скобками) получилось выражение «ONE» = «one«, следует помнить о том,что если результирующий код (код завершения) равен 0, выражение считается истинным, а в противном случае, соответственно, ложным. Чтобы отобразить результирующий код, достаточно воспользоваться специальной переменной $?, которая показывает код завершения для любой команды UNIX или Linux. В нашем случае код завершения будет выглядеть так:
$ test "ONE" = "one" $ echo $? 0
Коды завершения могут применяться в сценариях оболочки для проверки состояния выполнения любой из используемых в них команд.
При сравнении целых чисел вместе с командой test можно также применять следующие операции отношения:
-ne: не равно -eq: равно -lt: меньше -gt: больше -ge: больше или равно -le: меньше или равно
Запуск программ оболочки с аргументами командной строки
Для спецификации параметров программ оболочки часто используются аргументы командной строки. Например, программа example.ksh может быть запущена следующим образом:
$ example.ksh prod1 system
В данном случае example.ksh — это имя файла, в котором находится сценарий оболочки, а prod1 и system — аргументы командной строки, указывающие, соответственно, на имя базы данных и имя пользователя в этой базе данных. Внутри сценария оболочки есть два аргумента $1 и $2, которые соответствуют prod1 и system.
В UNIX используется позиционная система, означающая, что первый аргумент после имени сценария оболочки является значением переменной $1, второй — значением переменной $2 и т.д. То есть под каждой встречающейся внутри сценария ссылкой на переменную $1 подразумевается, что данная переменная ссылается на первый аргумент (каковым в приведенном примере является имя базы данных prod1).
За счет применения аргументов командной строки сценарий можно использовать повторно для нескольких различных комбинаций имени базы данных и имени пользователя, без внесения в него изменений
Анализ сценария оболочки
Давайте рассмотрим простой, предназначенный для наблюдения за базой данных сценарий оболочки по имени example.ksh. Этот сценарий выполняет проверку на предмет наличия определенного файла и уведомляет, если ему не удается его отыскать.В нем используется один аргумент командной строки для указания имени базы данных,а это значит, что в нем должна присутствовать переменная $1.
При создании программы оболочки UNIX никак не может знать, что эта программа является исполняемой. Для уведомления UNIX о том, что программа представляет собой исполняемый сценарий оболочки, применяется команда chmod:
$ ll example.ksh -rw-rw-rw- 1 salapati dba 439 feb 02 16:51 example.ksh $ chmod 766 example.ksh $ ll example.ksh 4-rwxrw-rw- 1 salapati dba 439 feb 02 16:52 example.ksh $
Здесь можно увидеть, что при первоначальном создании сценарий не был исполняемым, поскольку не предусматривал ни для кого прав на выполнение. За счет применения команды chmod разрешение на выполнение этого сценария было предоставлено его владельцу (salapati) и после этого он стал исполняемым.
Ниже приведено содержимое сценария оболочки example.ksh, предусматривающее выполнение проверки на предмет наличия в каталоге определенного файла и отправку соответствующего электронного сообщения администратору баз данных в случае, если его там не окажется:
#!/bin/ksh
ORACLE_SID=$1 export ORACLE_SID
PATH=/usr/bin:/usr/local/bin:/usr/contrib./bin:$PATH
export PATH
ORACLE_BASE=${ORACLE_HOME}/../..;
export ORACLE_BASE
export CURRDATE='date +%m%dY_%H%M'
export LOGFILE=/tmp/dba/dba.log
test -s $ORACLE_HOME/dbs/test${ORACLE_SID}.dbf
if [ 'echo $?' -ne 0 ]
then
echo "Файл не найден!"
mailx -s "Критическая ошибка: тестовый файл не найден!" Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. < $LOGFILE
fi
Теперь вкратце проанализируем содержимое сценария. В первой строке объявляется о том, что данная программа будет использовать оболочку Korn — именно это и обозначает самая верхняя строка #!/bin/ksh. Такая строка является стандартной для программ, предназначенных для оболочки Korn (и выглядит примерно так же и в программах, предназначенных для других оболочек).
В следующей строке мы видим, что переменной среды ORACLE_SID назначается значение переменной $1. Это значит, что во время выполнения программы оболочки переменной $1 будет присваиваться значение первого передаваемого параметра и что именно оно и будет устанавливаться для переменной среды ORACLE_SID. Еще в этой строке выполняется экспорт значения для переменной среды ORACLE_BASE.
Далее в программе экспортируются значения для трех переменных среды — PATH,CURRDATE и LOGFILE. Затем в сценарии используется команда тестирования файла,test, для выполнения проверки на предмет существования в конкретном месте файла testprod1.dbf (где prod1 соответствует значению ORACLE_SID). В UNIX успешное выполнение команды обозначается значением 0, а неудачное — значением 1; еще нужно вспомнить о том, что echo $?variable_name будет приводить к выводу значения переменной на экран. Исходя из этого, идущая далее строка, if [ ‘echo $? ‘ -ne 0], дословно означает: “если результат выполнения команды test негативный” (или, другими словами, “если файл не существует”). Потом идет оператор then, который в случае,если данное условие истинно (файл не существует), будет заносить в журнальный файл сообщение “Файл не найден!”, а также с помощью программы mail отправлять администратору баз данных электронное сообщение о том, что требуемый файл отсутствует.Программа mail позволяет отправлять электронные сообщения как на личный электронный адрес человека, так и на адрес учетных записей пользователей, находящихся на другом сервере UNIX.
Все, что необходимо сделать, чтобы запустить или выполнить этот сценарий оболочки — ввести его имя в командной строке и указать после него имя интересующей базы данных. Чтобы этот метод сработал, однако, при запуске сценария нужно обязательно находиться в оболочке Korn.
Теперь, когда мы рассмотрели, как создается простой сценарий, давайте перейдем к изучению более мощных и при этом все равно легких приемов, позволяющих писать более сложные программы оболочки.
Вас заинтересует / Intresting for you:
Shell — это интерфейс операционной системы. Он принимает команды от пользователей и интерпретирует их в операционной системе. Если вы хотите запустить несколько команд вместе, вы можете сделать это, создав сценарий оболочки. Сценарии оболочки очень полезны, если вам нужно регулярно выполнять задачу, например создание резервной копии. Вы можете перечислить эти команды и выполнить их все с помощью всего одного скрипта. Давайте посмотрим, как вы можете создать сценарий оболочки и запустить его в Linux.
Создание сценария оболочки
Войдите на свой компьютер с Linux и откройте терминал, перейдите в папку, в которой вы хотите сохранить сценарий оболочки. Сценарии оболочки заканчиваются расширением «.sh». Давайте создадим наш первый сценарий оболочки. Введите
touch script.sh
Теперь этот файл скрипта не является исполняемым по умолчанию, мы должны дать этому файлу разрешение на выполнение. Введите
chmod +x script.sh
Теперь мы добавим несколько команд в этот сценарий оболочки. Откройте этот сценарий оболочки в любом текстовом редакторе по вашему выбору (на основе командной строки или на основе графического интерфейса) и добавьте несколько команд. Мы будем использовать нано. Введите
nano script.sh
Добавьте следующие команды, чтобы протестировать этот сценарий оболочки.
echo This is my first shell script touch testfile ls echo End of my shell script
Сохраните изменения и запустите сценарий оболочки, набрав
./script.sh
Как видите, он выполнил все указанные команды.
Комментарии в сценарии оболочки
Любая строка, начинающаяся с «#» в сценарии оболочки, рассматривается как комментарий и игнорируется оболочкой во время выполнения, за исключением строки shebang, которую мы увидим позже в этой статье. Давайте посмотрим пример. Сценарий оболочки создается со следующим содержимым.
# This is a comment echo Testing comments in shell script
Как видите, комментарий игнорируется.
Переменные в сценарии оболочки
Да, сценарии оболочки поддерживают использование переменных, и нам не нужно определять тип переменной во время ее объявления. Существует два типа переменных:
- Системные переменные
- Пользовательские переменные.
Системные переменные, также называемые переменными среды, обычно пишутся с большой буквы. Вы можете просмотреть все текущие переменные среды с помощью команды printenv. Пользовательские переменные задаются пользователем и существуют только во время выполнения скрипта. Вы можете определить переменную, просто набрав ее имя и присвоив значение со знаком =, и получить доступ к переменной, добавив $ перед именем переменной. Переменные демонстрируются в следующем примере скрипта.
# Accessing an Environment Variable echo $USER # Creating and accessing User defined Variable variable_name="Geeksforgeeks" echo $variable_name
Определение интерпретатора сценария оболочки
В Linux доступно множество оболочек, таких как оболочка Bourne (sh), оболочка Korn (ksh) и оболочка GNU Bourne-Again (bash). Сценарии, написанные для оболочки sh, называются сценариями оболочки, и они могут интерпретироваться как оболочками ksh, так и оболочками bash. ksh и Bash являются улучшенными версиями оригинальной оболочки sh и имеют больше возможностей, чем sh. Bash обычно является оболочкой по умолчанию в большинстве дистрибутивов Linux, а сценарии, написанные специально для оболочки bash, называются сценариями bash.
Вы можете указать, какую оболочку будет использовать сценарий, даже если сценарий выполняется из другого терминала оболочки. Для этого добавьте «#!» поверх файла сценария, за которым следует абсолютный путь к выбранной оболочке. Чтобы указать bash в качестве интерпретатора, добавьте следующую строку поверх сценария оболочки.
#!/bin/bash
Эта линия называется линией Шебанга.
Примечание. Это будет работать, только если в вашей системе установлен bash.
Операторы сравнения
Вы можете сравнить две переменные в сценариях оболочки. Мы делаем эти сравнения для принятия решений, мы увидим, как это сделать позже в этой статье, но перед этим вот список некоторых операторов сравнения.
Целочисленное сравнение
Оператор | Описание |
---|---|
-экв | равно |
-ne | не равно |
-gt | больше, чем |
-гэ | Больше или равно |
-lt | меньше чем |
-ле | меньше или равно |
Сравнение строк
Оператор | Описание |
---|---|
== | равно |
знак равно | не равно |
< | меньше чем в алфавитном порядке ASCII |
> | больше, чем в алфавитном порядке ASCII |
Мы добавляем перед < и >, потому что их нужно экранировать при вводе в конструкции [ ]. Теперь давайте посмотрим, где они используются.
Условные операторы
Условные операторы используются для выполнения блока кода только при соблюдении определенных условий. Сценарии оболочки поддерживают использование условных операторов. Мы используем операторы сравнения для проверки условий. Давайте посмотрим на несколько условных операторов.
Если заявление
Он проверяет условие и, если оно истинно, выполняет команды.
Синтаксис
if [ condition ] then #statements fi
Давайте посмотрим пример.
#!/bin/sh x=10 y=11 if [ $x -ne $y ] then echo "Not equal" fi
Оператор if-else
В операторе if-else вы можете указать набор команд, которые будут выполняться, если условие не выполняется.
Синтаксис
if [ condition ] then #set of statements if the condition is true else #set of statements if the condition is false fi
Давайте посмотрим на пример
#!/Syntaxbin/sh x=10 y=10 if [ $x -ne $y ] then echo "Not equal" else echo "They are equal" fi
Есть и другие условные операторы, вы можете прочитать о них здесь.
Примечание. Введите пробел после [ и перед ] при указании проверяемого условия, иначе вы получите сообщение об ошибке.
Петли
Используя циклы, вы можете повторять набор команд снова и снова, пока не будет выполнено определенное условие. Давайте посмотрим на некоторые петли.
Пока цикл
Он запускает указанные команды, если условие истинно, и повторяет их до тех пор, пока условие не станет ложным.
Синтаксис
while [ condition ] do #set of statements done
Давайте посмотрим пример.
#!/bin/sh x=2 while [ $x -lt 6 ] do echo $x x=`expr $x + 1` done
Мы заключаем оператор expr в ` ` при присвоении его переменной. Вы можете прочитать о команде expr здесь.
Для цикла
В цикле for переменная выполняет итерацию по списку значений и завершается, когда больше нет значений для итерации.
Синтаксис
for var in val1 val2 val3 do #statements done
Давайте посмотрим пример.
#!/bin/sh for var in 2 4 5 8 do echo $var done
Подробно о циклах можно прочитать здесь.
Позиционные аргументы
Позиционные аргументы — это аргументы или значения, которые мы передаем сценарию оболочки при выполнении сценария. Доступ к ним осуществляется через переменные $0, $1, $2…$9. Кроме того, на них ссылаются ${10}, ${11} и так далее. $# хранит количество переданных аргументов, а $0 хранит имя скрипта. Давайте посмотрим на пример, чтобы понять все это.
#!/bin/sh echo "No of arguments is $#" echo "Name of the script is $0" echo "First argument is $1" echo "Second argument is $2"
Чтобы передать аргументы, просто введите их в терминале после имени скрипта, как показано ниже.
Хранение вывода команд
Вы можете сохранить вывод команд внутри переменной в сценарии оболочки. Есть два способа сделать это.
Синтаксис
#Syntax 1 var=$(a valid linux command) #Syntax 2 var2=`a valid linux command`
Давайте посмотрим пример.
#!/bin/sh b=$(pwd) c=`pwd` echo $b echo $c d=$(ls /bin | grep bash) echo $d
Коды выхода команд оболочки
Всякий раз, когда команда завершается и возвращает управление родительскому процессу, она возвращает коды выхода от 0 до 255. Код выхода 0 означает, что команда выполнена успешно, а любой другой код выхода означает, что команда не выполнена. Вы можете просмотреть код выхода после выполнения любой команды, обратившись к #? переменная. См. пример ниже.
Вы можете вручную установить код выхода для вашего сценария оболочки. Это можно использовать с условными операторами, чтобы сообщить, была ли достигнута цель сценария или нет.
Пример
#!/bin/sh read x if [ $x -ne 10 ] then echo failed exit 1 else echo passed exit 0 fi