首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Else-If带有空变量的饱和元素不起作用

Else-If带有空变量的饱和元素不起作用
EN

Stack Overflow用户
提问于 2018-05-13 03:07:31
回答 2查看 80关注 0票数 0

我正在尝试在shell/bash脚本中编写一个if-else条件,它将用于许多不同的文件,因此它不适合特定的结构。

我有三个不同的文件,并且从每个文件中选择了最多三个不同的变量,这些变量进入if-else语句。在我的脚本中,我将这段代码写在开头(可能写得更好),如下所示:

代码语言:javascript
复制
ANC1=$(sed -n 1p file1 | cut -f 1 -d' ' )
ANC2=$(sed -n 2p file1 | cut -f 1 -d' ' )
ANC3=$(sed -n 3p file1 | cut -f 1 -d' ' )

ANC11=$(sed -n 1p file2 | cut -f 1 -d' ' )
ANC21=$(sed -n 2p file2 | cut -f 1 -d' ' )
ANC31=$(sed -n 3p file2 | cut -f 1 -d' ' )

ANC15=$(sed -n 1p file3 | cut -f 1 -d' ' )
ANC25=$(sed -n 2p file3 | cut -f 1 -d' ' )
ANC35=$(sed -n 3p file3 | cut -f 1 -d' ' )

例如,从这些文件中,可能会产生以下变量:

代码语言:javascript
复制
echo ${ANC1}
FIN
echo ${ANC2}
NFE
echo ${ANC3}


echo ${ANC11}
FIN
echo ${ANC21}
NFE
echo ${ANC31}


echo ${ANC15}
FIN
echo ${ANC25}
NFE
echo ${ANC35}
SAS 

从这里开始,我编写了if-else语句(考虑到上面提到的三个文件中可能缺少的变量)。为了理解它,尝试执行以下操作:

第一个条件:如果所有变量都不为空;第二个条件:如果第三个变量是唯一缺少的变量;第三个条件:如果第三个和第二个变量为空

代码语言:javascript
复制
if [ "${ANC3}" != "" ] || [ "${ANC31}" != "" ] || [ "${ANC35}" != "" ]; then

    echo "***** three variables *****"

    bcftools merge -m both \
    fileref1.genotypes_${ANC1}.vcf.gz \
    fileref1.genotypes_${ANC2}.vcf.gz \
    fileref1.genotypes_${ANC3}.vcf.gz \
    -Oz \
    -o fileref1.new.genotypes_${ANC1}.${ANC2}.${ANC3}.vcf.gz

    bcftools merge -m both \
    fileref2.genotypes_${ANC11}.vcf.gz \
    fileref2.genotypes_${ANC21}.vcf.gz \
    fileref2.genotypes_${ANC31}.vcf.gz \
    -Oz \
    -o fileref2.new.genotypes_${ANC11}.${ANC21}.${ANC31}.vcf.gz

    bcftools merge -m both \
    fileref3.genotypes_${ANC15}.vcf.gz \
    fileref3.genotypes_${ANC25}.vcf.gz \
    fileref3.genotypes_${ANC35}.vcf.gz \
    -Oz \
    -o fileref1.new.genotypes_${ANC15}.${ANC25}.${ANC35}.vcf.gz

elif 
    [ "${ANC3}" == "" -a "${ANC2}" != "" ] || [ "${ANC31}" == "" -a "${ANC21}" != "" ] || [ "${ANC35}" == "" -a "${ANC25}" != "" ]; then

    echo "***** two variables *****"

    bcftools merge -m both \
    fileref1.genotypes_${ANC1}.vcf.gz \
    fileref1.genotypes_${ANC2}.vcf.gz \
    -Oz \
    -o fileref1.new.genotypes_${ANC1}.${ANC2}.vcf.gz

    bcftools merge -m both \
    fileref2.genotypes_${ANC11}.vcf.gz \
    fileref2.genotypes_${ANC21}.vcf.gz \
    -Oz \
    -o fileref2.new.genotypes_${ANC11}.${ANC21}.vcf.gz

    bcftools merge -m both \
    fileref3.genotypes_${ANC15}.vcf.gz \
    fileref3.genotypes_${ANC25}.vcf.gz \
    -Oz \
    -o fileref1.new.genotypes_${ANC15}.${ANC25}.vcf.gz

elif 
    [ "${ANC3}" == "" -a "${ANC2}" == "" ] || [ "${ANC31}" == "" -a "${ANC21}" == "" ] || [ "${ANC35}" == "" -a "${ANC25}" == "" ]; then 

    echo "***** one variable ***** "

    cp fileref1.genotypes_${ANC1}.vcf.gz fileref1.new.genotypes_${ANC1}.${ANC2}.vcf.gz

    cp fileref2.genotypes_${ANC11}.vcf.gz fileref2.new.genotypes_${ANC11}.vcf.gz

    cp fileref3.genotypes_${ANC15}.vcf.gz fileref1.new.genotypes_${ANC15}.vcf.gz

fi

每次我运行这个脚本时,都会生成3个文件,但有时情况并非如此。第一部分有效(对于所有变量都不为空的文件)-但第二和第三个条件似乎不起作用。我还尝试了[ -z "${ANC3}" ][ -n "${ANC2}" ]来分别表示缺失和非缺失,但这也不起作用。我也尝试过[[ ]][ ]的比较,但仍然是一样的。

我明显漏掉了什么吗?

EN

回答 2

Stack Overflow用户

发布于 2018-05-13 03:35:26

我不确定我是否理解逻辑是如何工作的,但我认为您在使用De Morgan's laws时可能会遇到问题,这与逻辑否定如何与and和OR相结合有关。英语在这一点上往往相当草率,所以当你将你想要的东西转换成代码逻辑时,你必须仔细考虑。具体来说,您说的是“第一个条件:如果所有变量都不是空的”,而是相应的if语句:

代码语言:javascript
复制
if [ "${ANC3}" != "" ] || [ "${ANC31}" != "" ] || [ "${ANC35}" != "" ]; then

..actually对应于“如果任何变量不为空”。

在您给出的示例中,ANC3ANC31都为空(因此前两个测试返回为false),而ANC35不为空(为"SAS"),因此第三个测试为真。false || false || true的计算结果为true,因此if条件整体为true,且将执行if语句的分支。当只有一个变量为非空时,这是应该发生的事情吗?

如果我对这个问题的判断是正确的,那么第一个if语句应该是&&s而不是||s,如下所示:

代码语言:javascript
复制
if [ "${ANC3}" != "" ] && [ "${ANC31}" != "" ] && [ "${ANC35}" != "" ]; then

elif测试也可能有类似的问题,但正如我所说的,我不确定我是否理解它应该正确地做什么。

票数 1
EN

Stack Overflow用户

发布于 2018-05-13 13:47:00

这并不是一个完整的答案,但以下是给定变量$x$y$z的简单POSIX shell示例:

第一个条件:如果所有变量都不为空;

代码语言:javascript
复制
[ "$x" -a "$y" -a "$z" ] && do_stuff

第二个条件:如果第三个变量是唯一缺少的变量;

代码语言:javascript
复制
[ "$x" -a "$y" -a ! "$z" ] && do_stuff

第三个条件:如果第三个和第二个变量为空

代码语言:javascript
复制
[ "$y$z" ] || do_stuff
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50309798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档