Учебная страница курса биоинформатики,
год поступления 2016
Указания к практикуму 9
Переменные
В bash значение пременной задаётся выражением имя=значение (без пробелов!). Значение переменной вызывается символом $ перед именем. Например:
x=~/term2 echo $x ls $x cp $x/temp.txt .
Чтобы отделить имя переменной от последующих символов, используются фигурные скобки, например:
y=two echo one${y}three
(так ответ будет "onetwothee", а без фигурных скобок "one", потому что переменной ythree не существует).
Имеется некоторое количество служебных переменных, например HOME, PWD, PATH и PS1. Изменение последней позволяет изменить вид приглашения ввести команду. При задании этой (и других) переменных полезно брать нужное значение в кавычки (лучше одинарные), поскольку многие используемые в ней символы являются спецсимволами bash. Например:
PS1=\h:\W>
приведёт не к тому результату, который, скорее всего, имелся в виду, правильно будет:
PS1='\h:\W> '
Полное описание "языка" PS1 читайте в man bash, раздел PROMPTING. Можно и найти этот раздел в Интернете...
Если вы хотите, чтобы значение какой-то переменной не пропадало после выполнения выхода, имеет смысл завести в своей домашней диретории файл .bash_profile (название начинается с точки) и туда поместить строку с определением переменной. Все строки этого файла вполняются как команды bash каждый раз, когда вы вводите свой логин и пароль.
Сценарии
Сценарий (в разговорной речи — "скрипт") — это текстовый файл, содержащий команды bash. Простейший сценарий имеет вид:
команда1 команда2 команда3 ...
Например:
echo "Hello!" a=Vasya echo $a echo "Hello," $a > new.txt ls -l rm new.txt
Сценарии лучше помещать в файлы с расширением sh, например myscript.sh.
Запустить сценарий можно двумя способами:
bash myscript.sh
или
chmod +x myscript.sh ./myscript.sh
Здесь команда chmod +x нужна для того, чтобы придать файлу свойство исполняемости, её нужно выполнять только перед самым первым запуском сценария.
Переменные и циклы в сценарии
В сценарии можно задавать переменные так же, как и при обычной работе в bash.
Кроме того, во время исполнения сценария в специальных переменных $1, $2 и т.д. хранятся первый, второй и т.д. аргументы командной строки, введённые пользователем при вызове сценария. Например, если сценарий myscript.sh содержит строку:
echo "Hello," $1
то при вызове его в таком варианте:
bash myscript.sh Vasya
появится сообщение "Hello, Vasya"
В сценарии можно использовать циклы. Простейший цикл, по явно заданному списку, пишется так:
for x in human chick rat mouse do infoseq sw:cyb5_${x} -auto done
Здесь x — переменная, параметр цикла. Тело цикла заключено между ключевыми словами do и done (при этом отступ, в отличие от python, не обязателен, но желателен для читаемости человеком).
Список для цикла можно задавать несколькими способами, например:
for x in *.sh do chmod +x $x done
Здесь вместо *.sh интерпретатор bash подставит список всех файлов текущей директории с расширением .sh, тем самым результатом работы сценария будет придание исполняемости всем таким файлам.
Чтобы запустить цикл по строкам некоторого файла, удобно воспользоваться обратными кавычками. В bash выражение, заключённое в обратные кавычки, выполняется как обычная команда и её результат (stdout) подставляется вместо всего выражения. Например, в результате выполнения команды
x=`grep -c bigfile.txt`
в переменную x будет записано число строк в файле "bigfile.txt". В сценарии же можно удобно превратить слова файла в список таким образом:
for x in `cat list.txt` do echo $x done
Такми образом, если вам нужно проделать одну и ту же операцию для некоторого заранее заданного списка значений, можно записать эти значения в файл (через пробел или же по одному в строке, это неважно) и написать цикл вышеприведённого вида.