然后,elif,或者声明我已经用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
.
.
.
为什么脚本没有检测到我要查找的字符串,但是它在终端?
编辑: 我试过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
答案 0 :(得分:2)
我认为你的代码有一个逻辑错误,没人发现。我不确定,因为你没有告诉我们剧本应该做什么,但它看起来像你想要的只是在你找不到任何一个模式的匹配时才要求手动输入输出中的任何位置,但您实际上正在检查匹配的输出的第一个单词。从您的示例输出中,第一个单词是“@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