Se poi elif then else istruzione in bash

quindi, elif, altrimenti la dichiarazione che ho programmato in uno script bash. So che funziona perché posso eseguire lo stesso comando nel terminale di interfaccia e vedere che si sta facendo quello che voglio fare. Tuttavia quando mi imbatto in uno script sembra di saltare sempre per l’istruzione else e non rileva nulla. C’è qualcuno che può aiutare a spiegare perché è così? Ecco il mio codice di script:

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

Non importa che cosa il file I plug in che salta sempre l’altro e mi chiede per l’inserimento manuale.

Qui è il comando che ho eseguito sul terminale:

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

E l’output è simile a questo:

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
.
.
.

Perché lo script non rilevando la stringa sto cercando, ma è nel terminale?

MODIFICA:
Ho provato quello che Charles ha detto, questo è l’output:

:+'[' -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
  • Eseguire con PS4=:${BASH_LINENO}+ bash -x yourscript per vedere cosa sta succedendo durante l’esecuzione.
InformationsquelleAutor | 2012-03-13



One Reply
  1. 2

    Penso che il tuo codice è un errore di logica nessuno è macchiato di sicurezza. Io non sono sicuro, dato che non ci hai detto cosa dello script dovrebbe fare, ma mi sembra che quello che vuoi è quello di chiedere per l’inserimento manuale solo se non si trova una corrispondenza di uno dei tuoi modelli ovunque in uscita, ma ciò che si sta effettivamente facendo è esaminare le prima parola di uscita per una partita. E dal tuo output di esempio, la prima parola è “@HD”, che non corrisponde a uno schema, in modo che lo script sta facendo esattamente quello che mi aspetto.

    Ora, supponendo che io abbia ragione e che il punto è quello di cercare uno schema ovunque in uscita, effettivamente, è possibile semplificare le cose un po’. Soprattutto, non avete bisogno di un ciclo, si può solo fare un confronto per cercare il modello di tutta la produzione in una volta:

    #!/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
    • Stavo giusto pensando che era solo la prima riga. Check it out ora.
    • Questo elimina anche i problemi con la non quotate utilizzare gli apici inversi; se hai determinato con precisione intenzione dell’utente, questo fa un sacco di cose migliore.
    • Questa è una soluzione migliore, funziona. Grazie uomo!
    • E anche tu, Charles!

Lascia un commento