Shell script — различия между версиями

Материал из pNp Wiki
Перейти к: навигация, поиск
(Использование переменных)
Строка 116: Строка 116:
 
This is number twelve: 12
 
This is number twelve: 12
 
[root@vm-01 ~]#
 
[root@vm-01 ~]#
 +
</syntaxhighlight>
 +
 +
== Расширения командного интерпретатора ==
 +
Кроме переменных, <code>bash</code> позволяет использовать подстановку команд и арифметические операции
 +
 +
==== Подстановка команд ====
 +
Подстановка команд осуществляется путем помещения команды в обратные кавычки <code>`</code>, либо путем указания переменной в круглых скобках <code>()</code>. Например:
 +
<syntaxhighlight lang="bash">
 +
[root@vm-01 ~]# cat test.sh
 +
#!/bin/bash
 +
cli="`which bash`"
 +
curl="$(which curl)"
 +
echo "My bash is here: ${cli} and curl is here: ${curl}"
 +
[root@vm-01 ~]# ./test.sh
 +
My bash is here: /usr/bin/bash and curl is here: /usr/bin/curl
 +
[root@vm-01 ~]#
 +
</syntaxhighlight>
 +
Второй способ предпочтительнее, так как он поддерживает вложенность команд. Например:
 +
<syntaxhighlight lang="bash">
 +
 
</syntaxhighlight>
 
</syntaxhighlight>

Версия 17:09, 26 марта 2018

Основы создания скриптов на bash

Предварительные требования

  • Виртуальная машина с двумя сетевыми интерфейсами
  • Установленные пакеты: bash, bash-completion, vim-minimal, vim-enhanced

Общая информация

Любой скрипт, начинается с "магической строки" - сигнатуры, которая говорит командному интерпретатору как обрабатывать файл. Для скриптов, такая последовательность носит называние she-bang (сокращение от sharp-bang):

#!

Соответственно, если файл должен обрабатывать bash, то это необходимо указать после "магической строки". То есть, she-bang будет иметь следующий вид:

#!/bin/bash

Если скрипт предназначен для пользователя, то должны быть выставлен необходимый владелец файла, и права на запуск скрипта 755. Поскольку скрипт является выполняемым, то по первым литерам названия, коммандный интерпертатор производит поиск названия в переменной $PATH, соответственно, лучше выбрать имя для скрипта, которое не совпадает с имеющейся утилитой. Для просмотра переменной $PATH надо выполнить следующую команду:

[root@vm-01 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@vm-01 ~]#

Поскольку текущая директория /root отсутствует в переменной $PATH, то запускать скрипты необходимо следующим образом:

[root@vm-01 ~]# ls -lahi test.sh 
33969143 -rwxr-xr-x. 1 root root 34 Mar 26 10:38 test.sh
[root@vm-01 ~]# ./test.sh 
Hello, world!
[root@vm-01 ~]#

Вывод на экран

Скрипт test.sh использует комманду echo для отображения текстовой строки. По-умолчанию отображение производится на стандартный поток вывода (STDOUT):

[root@vm-01 ~]# cat test.sh 
#!/bin/bash

echo "Hello, world!"
[root@vm-01 ~]#

Хорошим тоном считается выводить ошибки на поток ошибок (STDERR):

[root@vm-01 ~]# cat test.sh 
#!/bin/bash

echo "Hello, world!"
echo "Something has happend! Can not proceed!" >&2
[root@vm-01 ~]#

Запустим скрипт таким образом, что бы поток ошибок направлялся в файл:

[root@vm-01 ~]# ./test.sh 2>test.log
Hello, world!
[root@vm-01 ~]# cat test.log 
Something has happend! Can not proceed!
[root@vm-01 ~]#

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

[root@vm-01 ~]# cat test.sh 
#!/bin/bash

echo "$PATH"
[root@vm-01 ~]# ./test.sh 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@vm-01 ~]#

Если необходимо вывести именно строку $PATH, то следует использовать символы экранирования (двойные кавычки ", одинарные кавычки ', либо обратный слэш \):

[root@vm-01 ~]# cat test.sh 
#!/bin/bash

echo "\$PATH"
echo '$PATH'

[root@vm-01 ~]# ./test.sh 
$PATH
$PATH
[root@vm-01 ~]#

Следует заметить, что двойные кавчки экранируют не все спецсимволы, поэтому если необходимо вывести какую-либо информацию как текст, то следует использовать одинарные кавычки, которые интерпретируют любую включенную в них информацию как текст! Обратный слэш (\) экранирует только символ следующий за ним!

Использование переменных

Переменная - это область памяти, которая хранит некое значение. К этой области памяти можно обращаться по имени. Название переменной не может начинаться с цифры! Например:

[root@vm-01 ~]# cat test.sh 
#!/bin/bash

one=1
echo "This is number $one"
 
[root@vm-01 ~]# ./test.sh 
This is number 1
[root@vm-01 ~]#

Хорошим тоном считается заключать значения, присваиваемые переменными в двойные кавычки, к примеру, потому, что в значении могут содержаться пробелы, а пробелы интерпретируются bash'ем как разделитель слова. Так же, хорошим тоном считается заключение переменных в фигурные скобки, так как переменные могут конкатенироваться непосредственно друг за другом, поэтому, во избежании получения неожиданных результатов, переменные следует записывать как ${one}. Пример конкатенцации переменных:

[root@vm-01 ~]# cat test.sh 
#!/bin/bash

one="1"
two="2"
echo "This is number twelve: ${one}${two}"

[root@vm-01 ~]# ./test.sh 
This is number twelve: 12
[root@vm-01 ~]#

Расширения командного интерпретатора

Кроме переменных, bash позволяет использовать подстановку команд и арифметические операции

Подстановка команд

Подстановка команд осуществляется путем помещения команды в обратные кавычки `, либо путем указания переменной в круглых скобках (). Например:

[root@vm-01 ~]# cat test.sh 
#!/bin/bash
cli="`which bash`"
curl="$(which curl)"
echo "My bash is here: ${cli} and curl is here: ${curl}" 
[root@vm-01 ~]# ./test.sh 
My bash is here: /usr/bin/bash and curl is here: /usr/bin/curl
[root@vm-01 ~]#

Второй способ предпочтительнее, так как он поддерживает вложенность команд. Например: