然后,elif,else语句,我已经编写了一个bash脚本。 我知道这是可行的,因为我可以在terminal界面中运行相同的命令,并看到它正在做我想做的事情。 然而,当我在脚本中运行它似乎总是跳转到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
无论我插入什么文件,它总是跳到别人,并要求我手动input。
这是我在terminal上运行的命令:
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 . . .
为什么脚本没有检测到我正在查找的string,但它在terminal?
编辑:我试过查尔斯说,这是输出:
:+'[' -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