Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_voprosy.docx
Скачиваний:
9
Добавлен:
20.03.2016
Размер:
465.35 Кб
Скачать

19.1. Предпосылки

Вам следует прочитать и понять Часть III расширения оболочки иЧасть IV Пайпы и команды до того, как начнете читать эту главу.

19.2. Hello World

Как и в каждом курсе программирования, мы начнем с простого скрипта hello_world. Следующий скрипт выведет Hello World.

echo Hello World

После создания этого простого скрипта в viилиecho, вам нужно прописатьchmod +x

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

[paul@RHEL4a ~]$ echo echo Hello World > hello_world

[paul@RHEL4a ~]$ chmod +x hello_world

[paul@RHEL4a ~]$ ./hello_world

Hello World

[paul@RHEL4a ~]$

19.3. 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 A bash subshell `echo -n hello`

Этот скрипт будет работать в оболочке Korn(если/bin/ksh не жесткая ссылка на /bin/bash)./etc/shells файл содержащий список оболочек вашей системы.

#!/bin/ksh

echo -n hello

echo a Korn subshell `echo -n hello`

19.4. Комментарии

Ещё чуть-чуть улучшим наш пример и добавим в него комментарии.

#!/bin/bash

#

# Hello World Script

#

echo Hello World

19.5. Переменные

Вот простой пример переменной в скрипте.

#!/bin/bash

#

# simple variable in script

#

var1=4

echo var1 = $var1

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

[paul@RHEL4a ~]$ echo $var1

[paul@RHEL4a ~]$ ./vars

var1 = 4

[paul@RHEL4a ~]$ echo $var1

[paul@RHEL4a ~]$

19.6. Источники скриптов

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

[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 ~]$

19.7. Устранение неполадок скриптов

Другой способ запуска скрипта в отдельной оболочке 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

# the runme script

var4=42

echo $var4

paul@debian6~/test$

Обратите внимание на отсутствие строки комментария (#) и замены переменной перед выполнением echo.

19.8. Предотвращение имитации корня setuid

Некоторые пользователи могут попытаться выполнить подмену основы скрипта setuid. Это редкое, но возможное явление. Для повышения безопасности скрипта, и чтобы избежать подмены переводчика, вам нужно добавить -- после#!/bin/bash, он отключает опцию дальнейшей обработки, чтобы команда не принимала никаких вариантов!.

#!/bin/bash -

or

#!/bin/bash --

Любые аргументы после -- рассматриваются как имена файлов и аргументы. Аргумент - эквивалентен --.

Глава 20. scripting loops

20.1. test [ ]

Тестовая команда может проверить, является ли что-то истинным или ложным. Давайте начнем с того, что удостоверимся, что 10 больше, чем 55.

[paul@RHEL4b ~]$ test 10 -gt 55 ; echo $?

1

[paul@RHEL4b ~]$

Тестовая команда возвращает 1, если тест не пройден. И, как вы увидите в следующем примере, что тест возвращает 0, когда проверка проходит успешно.

[paul@RHEL4b ~]$ test 56 -gt 55 ; echo $?

0

[paul@RHEL4b ~]$

Если вы предпочитаете trueиfalse, то напишите командуtest, как эту.

[paul@RHEL4b ~]$ test 56 -gt 55 && echo true || echo false

true

[paul@RHEL4b ~]$ test 6 -gt 55 && echo true || echo false

false

Тестовая команда также может быть записана в квадратных скобках, пример ниже идентичен примеру выше.

[paul@RHEL4b ~]$ [ 56 -gt 55 ] && echo true || echo false

true

[paul@RHEL4b ~]$ [ 6 -gt 55 ] && echo true || echo false

false

Ниже приведены примеры некоторых тестов. Взгляните на man test, чтобы увидеть больше вариантов.

[ -d foo ] Does the directory foo exist ?

[ -e bar ] Does the file bar exist ?

[ '/etc' = $PWD ] Is the string /etc equal to the variable $PWD ?

[ $1 != 'secret' ] Is the first parameter different from secret ?

[ 55 -lt $bar ] Is 55 less than the value of $bar ?

[ $foo -ge 1000 ] Is the value of $foo greater or equal to 1000 ?

[ "abc" < $bar ] Does abc sort before the value of $bar ?

[ -f foo ] Is foo a regular file ?

[ -r bar ] Is bar a readable file ?

[ foo -nt bar ] Is file foo newer than file bar ?

[ -o nounset ] Is the shell option nounset set ?

Тесты могут быть объединены с логическим И и ИЛИ.

paul@RHEL4b:~$ [ 66 -gt 55 -a 66 -lt 500 ] && echo true || echo false

true

paul@RHEL4b:~$ [ 66 -gt 55 -a 660 -lt 500 ] && echo true || echo false

false

paul@RHEL4b:~$ [ 66 -gt 55 -o 660 -lt 500 ] && echo true || echo false

true

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]