我想我不清楚如何做“和”测试。我想确保一个参数存在,这是很好的工作与[-e $VAR],但事实证明,这也是评估为真对一个空字符串;这是我不想要的。

我和他们怎么在一起?或者是否存在另一个一元测试来完成我想要的?


当前回答

现在我找到了答案。谢谢你的建议!

for e in ./*.cutoff.txt; do
if grep -q -E 'COX1|Cu-oxidase' $e
then
    echo xyz >$e.match.txt
else
    echo
fi

if grep -q -E 'AMO' $e
then
    echo abc >$e.match.txt
else
    echo
fi; done

对此有何评论?grep两次似乎效率很低,但它确实有效……

其他回答

if [ ! -z "$var" ] && [ -e "$var" ]; then
      # something ...
fi
if [ -n "$var" -a -e "$var" ]; then
    do something ...
fi

 

现在我找到了答案。谢谢你的建议!

for e in ./*.cutoff.txt; do
if grep -q -E 'COX1|Cu-oxidase' $e
then
    echo xyz >$e.match.txt
else
    echo
fi

if grep -q -E 'AMO' $e
then
    echo abc >$e.match.txt
else
    echo
fi; done

对此有何评论?grep两次似乎效率很低,但它确实有效……

从bash manpage:

[[expression]] -根据条件表达式表达式的求值,返回0或1的状态。

对于表达式,其中一个选项是:

Expression1 && expression2 -如果Expression1和expression2都为真,则为真。

所以你可以像下面这样把它们放在一起(-n是-z的反义词,所以我们可以去掉!):

if [[ -n "$var" && -e "$var" ]] ; then
    echo "'$var' is non-empty and the file exists"
fi

但是,我认为在这种情况下不需要,如果xyzzy文件存在并且可以很容易地处理空字符串,则-e xyzzy为真。如果这是你想要的,那么你实际上不需要-z非空检查:

pax> VAR=xyzzy
pax> if [[ -e $VAR ]] ; then echo yes ; fi
pax> VAR=/tmp
pax> if [[ -e $VAR ]] ; then echo yes ; fi
yes

换句话说,只需使用:

if [[ -e "$var" ]] ; then
    echo "'$var' exists"
fi

简单地引用你的变量:

[ -e "$VAR" ]

如果$VAR为空,则计算为[-e ""]。

您的版本无法工作,因为它的计算结果为[-e]。在本例中,bash只检查单个参数(-e)是否为非空字符串。

从手册中:

使用一组基于参数数量. ...的规则测试和[计算条件表达式] 1参数 当且仅当参数不为空时,表达式为真。

(此外,此解决方案还具有处理包含空格的文件名的额外好处)