Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 2018

Указания к практикуму 8

Переменные

В bash значение пременной задаётся выражением имя=значение (без пробелов!). Значение переменной вызывается символом $ перед именем. Например:

   1 x="~/term2"
   2 echo "$x"
   3 ls "$x"
   4 cp "$x/temp.txt" .

Чтобы отделить имя переменной от последующих символов, используются фигурные скобки, например:

   1 y="two"
   2 echo "one${y}three"

(так ответ будет "onetwothee", а без фигурных скобок "one", потому что переменной ythree не существует).

Имеется некоторое количество служебных переменных, например HOME, PWD, PATH и PS1. Изменение последней позволяет изменить вид приглашения ввести команду. При задании этой (и других) переменных полезно брать нужное значение в кавычки (лучше одинарные), поскольку многие используемые в ней символы являются спецсимволами bash. Например:

   1 PS1=\h:\W> 

приведёт не к тому результату, который, скорее всего, имелся в виду, правильно будет:

   1 PS1='\h:\W> '

Полное описание "языка" PS1 читайте в man bash, раздел PROMPTING.

Если вы хотите, чтобы значение какой-то переменной не пропадало после выполнения выхода, имеет смысл завести в своей домашней диретории файл .bash_profile (название начинается с точки) и туда поместить строку с определением переменной. Все строки этого файла вполняются как команды bash каждый раз, когда вы вводите свой логин и пароль.

Сценарии

Сценарий (в разговорной речи – "скрипт") — это текстовый файл, содержащий команды bash. Простейший сценарий имеет вид:

   1 #! /bin/bash
   2 команда1
   3 команда2
   4 команда3
   5 ...

Например:

   1 #! /bin/bash
   2 
   3 echo "Hello!"
   4 a="Vasya"
   5 echo "$a"
   6 echo "Hello, $a" > new.txt
   7 ls -l
   8 rm new.txt

Сценарии лучше помещать в файлы с расширением sh, например myscript.sh. Первая строка файла (#! /absolute/path/to/interpreter) называется "шебанг" (shebang). Это способ сообщить bash, какой интерпретатор команд использовать (это, например, может быть python, если скрипт написан на этом языке), если скрипт вызван методом ./script_name.sh (см. ниже). В случае, если не предполагается запускать сценарий таким образом, или если в качестве интерпретатора должен быть использован bash, шебанг можно опустить.

Запустить сценарий можно двумя способами:

   1 bash myscript.sh

или

   1 chmod +x myscript.sh
   2 ./myscript.sh

Здесь команда chmod +x нужна для того, чтобы придать файлу свойство исполняемости, её нужно выполнять только перед самым первым запуском сценария.

Переменные и циклы в сценарии

В сценарии можно задавать переменные так же, как и при обычной работе в bash.

Кроме того, во время исполнения сценария в специальных переменных $1, $2 и т.д. хранятся первый, второй и т.д. аргументы командной строки, введённые пользователем при вызове сценария. Например, если сценарий myscript.sh содержит строку:

   1 echo "Hello, $1"

то при вызове его в таком варианте:

   1 bash myscript.sh "Vasya"

появится сообщение "Hello, Vasya"

В сценарии можно использовать циклы. Простейший цикл, по явно заданному списку, пишется так:

   1 for x in "human" "chick" "rat" "mouse"
   2 do
   3   infoseq "sw:cyb5_${x}" -auto
   4 done

Здесь x – переменная, параметр цикла. Тело цикла заключено между ключевыми словами do и done (при этом отступ, в отличие от python, не обязателен, но желателен для читаемости человеком).

Список для цикла можно задавать несколькими способами, например:

   1 for x in *.sh
   2 do
   3    chmod +x "$x"
   4 done

Здесь вместо *.sh интерпретатор bash подставит список всех файлов текущей директории с расширением .sh, тем самым результатом работы сценария будет придание исполняемости всем таким файлам.

Чтобы запустить цикл по строкам некоторого файла, удобно воспользоваться специальной синтаксической конструкцией bash: $() . В bash выражение, заключённое в круглые скобки с предшествующим символом $, выполняется как обычная команда и её результат (stdout) подставляется вместо всего выражения. Например, в результате выполнения команды

   1 x=$(wc -l bigfile.txt)

в переменную x будет записано число строк в файле "bigfile.txt". В сценарии же можно удобно превратить слова файла в список таким образом:

   1 for x in $(cat list.txt)
   2 do
   3   echo "$x"
   4 done

Такми образом, если вам нужно проделать одну и ту же операцию для некоторого заранее заданного списка значений, можно записать эти значения в файл (через пробел или же по одному в строке, это неважно) и написать цикл вышеприведённого вида.

Какие команды использовать в заданиях 2 и 3 (подсказка)

Чтобы выбрать нужные строки из файла – grep. Чтобы выбрать нужные поля из строки – cut (не cat). Чтобы отформатировать строку – sed, хотя иногда достаточно tr. Чтобы вывести правильное сообщение с результатом – echo, хотя можете ещё взглянуть на printf (делает почти то же самое, но умеет чуть больше всего). Чтобы посчитать количество остатков определенного типа в fasta можно использовать конвейер из wordcount (EMBOSS, не wc) и grep. Но можно и без wordcount (сложнее, больше подстав, скорее всего получится медленнее).