Если тогда elif, тогда еще заявление в Bash - PullRequest
2 голосов
/ 14 марта 2012

затем, elif, else утверждение, которое я запрограммировал в скрипте bash. Я знаю, что это работает, потому что я могу запустить ту же команду в интерфейсе терминала и посмотреть, что она делает то, что я хочу. Однако когда я запускаю его в скрипте, он, кажется, всегда переходит к оператору else и ничего не обнаруживает. Кто-нибудь может помочь объяснить, почему это так? Вот мой код скрипта:

if [ -e "$1" ]
then
    for line in `samtools view -H $1`
    do
    if [[ "$line" ==  *NCBI-Build-36\.1* ]]
    then 
            echo "hg18"
            break
    elif [[ "$line" ==  *hg19* ]]
    then    
            echo "hg19"
            break
    else
            echo "Reference was not found, manual entry required: "
            read ans
            echo "$ans"
            break
    fi
    done
else
    echo -e "Usage: \e[1;32mreadRef.sh \e[1;36mbamfile.bam"
fi

Независимо от того, какой файл я подключаю, он всегда переходит к другому и запрашивает у меня ввод вручную.

Вот команда, которую я выполнил на терминале:

for line in `samtools view -H $bignormal`; do if [[ "$line" == *NCBI-Build-36\.1* ]]; then echo "YES - $line"; else echo "NO - $line"; fi; done

И вывод такой:

NO - @HD
NO - VN:1.0
NO - GO:none
NO - SO:coordinate
NO - @SQ
NO - SN:1
NO - LN:247249719
YES - AS:NCBI-Build-36.1
YES - UR:http://www.bcgsc.ca/downloads/genomes/9606/NCBI-Build-36.1/bwa_ind/genome/
NO - SP:Homo
NO - sapiens
.
.
.

Почему скрипт не обнаруживает искомую строку, но находится в терминале?

EDIT: Я попробовал то, что сказал Чарльз, это вывод:

:+'[' -e /projects/rcorbettprj2/DLBCL/CNV/RG065/normal/A01440_8_lanes_dupsFlagged.bam ']'
::+samtools view -H  /projects/rcorbettprj2/DLBCL/CNV/RG065/normal/A01440_8_lanes_dupsFlagged.bam
:+for line in '`samtools view -H $1`'
:+case "$line" in
:+echo 'Reference was not found, manual entry required: '
Reference was not found, manual entry required: 
:+read ans

1 Ответ

2 голосов
/ 14 марта 2012

Я думаю, что в вашем коде есть логическая ошибка, которую еще никто не заметил. Я не уверен, так как вы не сказали нам, что должен делать скрипт, но мне кажется, что вы хотите попросить ввести вручную, только если вы не нашли соответствия ни одному из ваших паттернов в любом месте вывода , но на самом деле вы проверяете только первое слово на совпадение. А из вашего примера вывода первое слово - «@HD», которое не соответствует ни одному из шаблонов, поэтому скрипт выполняет именно то, что я ожидал.

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

#!/bin/bash

if [ -e "$1" ]
then
    output="$(samtools view -H "$1")"
    if [[ "$output" ==  *NCBI-Build-36.1* ]]
    then 
            echo "hg18"
    elif [[ "$output" ==  *hg19* ]]
    then    
            echo "hg19"
    else
            read -p "Reference was not found, manual entry required: " ans
            echo "$ans"
    fi
    done
else
    echo -e "Usage: \e[1;32mreadRef.sh \e[1;36mbamfile.bam"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...