$ test1="hello" $ test2="test1" $ echo "${!test2}" hello
Из руководства
bash
:Если первый символ параметра - восклицательный знак (
!
), и параметр не является именем, он вводит уровень переменной косвенности. Bash использует значение переменной, сформированной из оставшейся части параметра в качестве имени переменной; эта переменная затем расширяется, и это значение используется в остальной части подстановки, а не а не значение самого параметра. Это известно как косвенное расширение. Если параметр является ссылкой на имя, это расширение выполняется до имени переменной, на которую ссылается параметр, вместо того, чтобы выполнить косвенное расширение. переменной, на которую ссылается параметр, вместо того, чтобы выполнять полное косвенное расширение. Исключением являются расширения типа${!prefix*}
и${!name[@]}
, описанные ниже. Восклицательный знак должен следовать непосредственно за левой скобкой, чтобы ввести косвенность.Для второй части вопроса я бы, вероятно, постарался избежать использования фактических переменных shell в шаблоне, а вместо этого использовал бы легко разбираемые заполнители и заменил бы их с помощью инструмента типа
sed
.Есть несколько похожих вопросов, включая "Как заменить строки-заполнители в документе содержимым из файла", "Инструмент для создания текстовых файлов из шаблона" и "Как заменить список заполнителей в текстовом файле?" (есть и другие).
#!/usr/bin/env perl
use strict;
use warnings;
while ( my $line = <> ) {
chomp($line);
if ($line =~ /\d+\s+\d+/) {
printf("%s\n", $line);
next;
}
my ( $head, $seq ) = split( /\s+/, $line );
my $newseq;
while ( $seq =~ /(...)/g ) {
if ( $1 !~ /tag|taa|tga/ ) {
$newseq .= $1;
}
}
printf("%s %s\n", $head, $newseq);
}
Запуск:
$ ./script input.fa >output.fa
Допущения и ограничения:
Режим работы:
$ head
(первый бит строки) и $ seq
(последовательность). $ newseq
), в противном случае они будут. Чтобы получить визуальную индикацию найденных стоп-кодонов, измените цикл на
while ( $seq =~ /(...)/g ) {
if ( $1 !~ /tag|taa|tga/ ) {
$newseq .= $1;
}
else {
$newseq .= "<STP>";
}
}