Bash не оценивает переменную при перенаправлении вывода команды - PullRequest
0 голосов
/ 07 июня 2019

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

Сценарий оболочки запускается так:

./trim_pair_align_ab1.sh 116102 128861

Сценарий может корректно отображать переменные (строки 15 и 16), и они соответствуют ожиданиям.

./temp/45739_1_PET22-001_116102_00_trim.fastq
./temp/45739_1_PET22-001_116102_00_trim.fasta

Невозможно оценить имя файла, когда команда перенаправляет вывод

line 17: temp/$(echo $f|sed 's/_trim.fastq/_trim.fasta/'): No such file or directory
8 for f in *.fastq
9 do
10 seqtk trimfq -q 0.05 $f > ./temp/$(echo $f|sed 's/.fastq/_trim.fastq/')
11 done
12 
13 for f in `eval ls ./temp/*$1*_trim.fastq`;
14 do
15 echo $f
16 echo $(echo $f|sed 's/_trim.fastq/_trim.fasta/')
17 seqtk seq -A $f > ./temp/$(echo $f|sed 's/_trim.fastq/_trim.fasta/')
18 done

Почему перенаправление вывода работает в строке 10, но не в строке 17?Что делает строку 17 буквальной, а не оцененной?

1 Ответ

2 голосов
/ 07 июня 2019

Подстановка команды - это расширяется; оболочка просто печатает код, который вы ей дали, а не результат этого расширения. Для реальной проблемы, вы захотите посмотреть дальше.


Внимательно посмотрите на echo, показывающий результат подстановки вашей команды:

./temp/45739_1_PET22-001_116102_00_trim.fasta

У него уже есть префикс a ./temp.

Когда вы добавляете второй такой префикс в ваше перенаправление (>./temp/$(...)), вы заставляете свой код пытаться создать файл в ./temp/temp/. Этот каталог не существует, поэтому вы получаете сообщение об ошибке.


Тем не менее, лучшая реализация будет выглядеть так:

for f in ./temp/*"$1"*_trim.fastq; do
  seqtk seq -A "$f" >"${f%.fastq}.fasta"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...