我有一个bash脚本,如果在运行该脚本时提供了特定的命令行标志,我想打印出该消息。例如,这是我的bash脚本
while getopts ":hi:l:1:2:U:O:s:p:5:3:qQm:M:I:X:" opt; do
case $opt in
i)
index_folder=$OPTARG # Input folder
;;
l)
lib_type=$OPTARG # Library type
;;
1)
left_reads+=("$OPTARG") # Left reads
;;
2)
right_reads=("$OPTARG") # Right reads
;;
U)
single_reads+=("$OPTARG") # single end reads
;;
O)
bam_out=$OPTARG # Samoutput file
;;
s)
sra_id=$OPTARG # SRA ID
;;
p)
num_threads=$OPTARG # Number of threads
;;
5)
five_trim=$OPTARG # 5' trim
;;
3)
three_trim=$OPTARG # 3' trim
;;
q)
quality_33=$OPTARG # Phred 33
;;
Q)
quality_64=$OPTARG # Phread 64
;;
m)
min_intl=$OPTARG # Minimum intron length
;;
M)
max_intl=$OPTARG # Maximum intron length
;;
t)
tra_as=$OPTARG # Report alignments tailored for transcript assemblers including StringTie
;;
c)
tra_cuff=$OPTARG # Report alignments tailored specifically for Cufflinks
;;
esac
done
if [ ! -z $left_reads ] && [ ! -z $right_reads ]; then
echo "original"
elif [ ! -z $left_reads ] && [ ! -z $right_reads ] && [ ! -o $quality_33 ];
then
echo "quality"
fi
当我尝试这样跑的时候。它正确打印
sh test.sh -i index -l "F" -1 reads_1.fq -1 e_coli_1000_1.fq -2 reads_2.fq -2 e_coli_1000_2.fq -p 2 -O final_bam -5 10 -3 10 -m 20 -M 200
original
然而,当我尝试包含一个额外选项(对应于第二个条件 - “质量”)时,它仍会打印第一个输出
sh Hisat2_align.sh -i index -l "F" -1 reads_1.fq -1 e_coli_1000_1.fq -2 reads_2.fq -2 e_coli_1000_2.fq -p 2 -O final_bam -5 10 -3 10 -m 20 -M 200 -q
original
我在这里做错了什么?
答案 0 :(得分:1)
根据您的optstring,-q
不接受参数,因此quality_33=$OPTARG
将空字符串赋给该变量
quality_33=0
,在这种情况下,分支使用quality_33=1
由于您使用elif
来测试-q
,并且if
条件属实,您将永远不会看到“质量”
测试[ ! -o $quality_33 ]
永远不会成立:变量为空,所以bash看到了
[ ! -o ]
- 在这种情况下,“ - o”被视为普通字符串而不是运算符,并且普通的非空字符串始终为true。然后你否定了那个结果。使用单括号时,始终引用您的变量:
elif [ ! -z "$left_reads" ] && [ ! -z "$right_reads" ] && [ "$quality_33" -eq 1 ]