我想我不太清楚如何进行“and”测试。我想确保一个参数使用[ -e $VAR ]
良好工作,但结果发现即使是空字符串也会被评估为真;而这并非我所想要的。
那么我该如何将它们“and”在一起呢?或者有没有其他一元测试可以实现我想要的功能?
if [ ! -z "$var" ] && [ -e "$var" ]; then
# something ...
fi
来自 bash
手册:
[[ expression ]]
- 根据条件表达式的计算结果返回0或1的状态。
对于条件表达式,其中之一选项是:
expression1 && expression2
- 如果expression1
和expression2
都为真,则返回真。
因此可以将它们 and
在一起,如下所示(-n
是 -z
的相反,因此我们可以摆脱 !
):
if [[ -n "$var" && -e "$var" ]] ; then
echo "'$var' is non-empty and the file exists"
fi
然而,在这种情况下,我认为它并不是必需的,-e xyzzy
如果 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" ]] && echo "'$var' exists"
来缩短它。 - jaypal singhif [ -n "$var" -a -e "$var" ]; then
do something ...
fi
POSIX
没有定义在具有复杂测试集的情况下与[
一起使用的行为,所以我们应该避免在[
中使用-a
或-o
。我在这里阅读到了这个信息(http://mywiki.wooledge.org/BashGuide/TestsAndConditionals?highlight=%28conditional%29#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29)。 - jaypal singhbash
和其他一些现代shell下可以工作。 - Slava Semushinbash
或其他现代shell,则更没有理由推荐-a
。 - chepner[ "$var1" -o "$var2" ]
;如果 var1=(
和 var2=)
,那么我们所拥有的是一个测试 -o
是否为空,而不是 var1
或 var2
中是否有任何一个非空。这种模棱两可是现代(即90年代后)带有正确引用的“test”命令中“x$var”习惯用法的唯一合理原因,而且这种习惯用法需要消失。 - Charles Duffy只需引用您的变量:
[ -e "$VAR" ]
$VAR
为空,就会被翻译成[ -e "" ]
。[ -e ]
。在这种情况下,bash只是检查单个参数(-e
)是否是非空字符串。(此外,这个解决方案还有一个额外的好处,就是可以处理包含空格的文件名)使用一组基于参数数量的规则来评估条件表达式...
1个参数
当且仅当参数不为空时,表达式为真。
我现在找到了答案。感谢您的建议!
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
;不过,要充分利用 "bashisms",请参考 @paxdiablo 的回答。 - mklement0-a
。 - Charles Duffy