在Bash中的if、then、elif和else语句

3

我已经在一个bash脚本中编写了then、elif和else语句。我知道它可以工作,因为我可以在终端界面中运行相同的命令,并看到它正在执行我想要的操作。但是当我在脚本中运行它时,似乎总是跳转到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

无论我插入什么文件,它总是跳到else分支并要求我手动输入。以下是我在终端上运行的命令:
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
.
.
.

脚本为什么无法检测到我要查找的字符串,但在终端中却可以检测到?
编辑: 我尝试了Charles所说的方法,这是输出结果:
:+'[' -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
运行 PS4=:${BASH_LINENO}+ bash -x yourscript 命令来查看执行过程中实际发生的情况。 - Charles Duffy
1个回答

3
我认为你的代码存在一个逻辑错误,目前还没有人发现。由于你没有告诉我们脚本的预期功能,所以我不确定,但是在我看来,你想要的是只有在输出中找不到任何一个模式时才要求手动输入,但实际上你只检查了输出的第一个单词是否匹配。从你的样本输出来看,第一个单词是"@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

我只是在想它只看了第一行。现在正在检查它。 - user1178682
1
这也消除了反引号未引用使用的问题;如果您准确确定了用户意图,这将使许多事情变得更好。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接