- •II. First steps on the command line
- •5. Man pages
- •6. Working with directories (работа с папками)
- •7.Working with files
- •8. Working with file contents
- •9. The Linux file tree
- •III. Shell expansion
- •10. Commands and arguments
- •11. Control operators
- •12. Variables
- •13. Shell history
- •14. File globbing
- •IV. Pipes and commands
- •Глава 16. Фильтры.
- •16.3 Grep
- •16.7. Sort
- •16.8. Uniq
- •16.9. Comm
- •16.12. Примеры пайпов
- •Глава 17. Основные инструменты Unix
- •17.1. Find
- •17.2. Размещение
- •17.3. Date
- •17.5. Sleep
- •17.6. Time
- •17.7. Gzip - gunzip
- •17.8. Zcat - zmore
- •18.3. Замена и удаление символов (r X X)
- •18.4. Отменить и повторить (u .)
- •18.5. Вырезать, копировать и вставить строчки (dd yy p p)
- •18.6. Вырезать, копировать и вставить строчки (3dd 2yy)
- •18.8. Объединения двух и более линий (j)
- •18.9. Слова (w b)
- •18.10. Сохранить (или нет) и выход (:w :q :q! )
- •18.11. Поиск (/ ?)
- •18.13. Чтение файлов (:r :r !cmd)
- •19.1. Предпосылки
- •19.2. Hello World
- •19.4. Комментарии
- •20.2. Если, затем, иначе (if then else)
- •20.3. If then elif
- •20.4. For loop
- •20.5. While loop
- •21.2. Shift through parameters.
- •21.3. Runtime input.
- •21.3. Sourcing a config file.
- •21.5. Get script options with getopts.
- •21.6. Get shell options with shopt.
- •Глава 22 More scripting.
- •22.1. Eval.
- •22.4. Case.
- •22.5. Shell functions.
- •Раздел VII. Local user management. Глава 23. Users.
- •23.1. Identify yourself.
- •23.2. Users.
- •23.3. Passwords.
- •23.4 Home directories
- •23.5 User shell
- •23.6. Switcj users with su
- •23.7 Run a program as another user
- •23.10 Shell environment
- •Глава 24. Groups
- •24.1 About groups
- •24.2 Groupadd
- •24.3 /Etc/group
- •24.4 Usermod
- •24.5 Groupmod
- •24.6 Groupdel
- •24.7 Groups
- •24.8 Gpasswd
- •24.9 Vigr
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