linux - bash 中的 If then elif then else 语句

标签 linux bash if-statement terminal

then, 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

无论我插入什么文件,它总是跳到 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
.
.
.

为什么脚本没有检测到我要查找的字符串,但它在终端中?

编辑: 我试过查尔斯所说的,这是输出:

:+'[' -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

最佳答案

我认为你的代码有一个逻辑错误还没有人发现。我不确定,因为你没有告诉我们脚本应该做什么,但在我看来你想要的是仅当你没有找到与你的任何一个模式匹配时才要求手动输入输出中的任何位置,但您实际做的只是检查匹配的输出的第一个单词。从您的样本输出来看,第一个词是“@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

关于linux - bash 中的 If then elif then else 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9691872/

相关文章:

c - 有没有办法从另一个进程向线程发送信号?

linux - Bash 脚本正则表达式

for-loop - 如何在 gwbasic 中编写将 1 到 100 的自然数相加的程序?

linux - 如何将文件系统或所有目录/etc/从 RO-ReadOnly 更改为 RW?

python - 解密堆栈跟踪中的 libc 元素

bash 读取命令

vba - 有条件地检查 VBA 中的 XPath 是否正确

c++ - 在 if-else 语句内部和外部保留修改后的值?

linux - Spring Security getprincipal() 方法返回字符串(用户名)代替类 UserDetails

c - 如何使用shell命令刷新