bash条件:如何“和”expression式? (如果)
我想我不清楚如何做“和”testing。 我想确保存在一个与[ -e $VAR ]
的论点,但是结果是空string也被评估为真; 我不想要。
我如何“和”他们在一起? 或者还有另一个完成我想要的testing吗?
if [ ! -z "$var" ] && [ -e "$var" ]; then # something ... fi
从bash
manpage:
[[ expression ]]
– 根据条件expression式的求值返回0或1的状态。
而对于expression式,其中一个选项是:
expression1 && expression2
– 如果expression1
和expression2
都为true,则为true。
所以你可以and
他们在一起如下( -n
是相反的-z
所以我们可以摆脱!
):
if [[ -n "$var" && -e "$var" ]] ; then echo "'$var' is non-empty and the file exists" fi
但是,在这种情况下,我不认为这是需要的 – 如果xyzzy
文件存在并且可以很容易地处理空string,则-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
if [ -n "$var" -a -e "$var" ]; then do something ... fi
简单地引用你的variables:
[ -e "$VAR" ]
如果$VAR
为空,则评估为[ -e "" ]
。
您的版本无效,因为它评估为[ -e ]
。 现在在这种情况下,bash简单地检查单个参数( -e
)是否为非空string。
从手册:
testing和[使用基于参数数量的一组规则来评估条件expression式。 …
1个参数
当且仅当参数不为null时,expression式才为真。
(另外,这个解决scheme还具有处理包含空格的文件名的额外好处)
我现在find了答案,谢谢你的build议!
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两次似乎效率低下,但它的工作原理…