我想我不清楚如何做“和”测试。我想确保存在一个与[ -e $VAR ]
一起运行良好的论证但事实证明在空字符串上也是如此。这是我不想要的。
我如何'和'他们在一起?或者是否有其他一元测试可以实现我想要的目标?
答案 0 :(得分:484)
if [ ! -z "$var" ] && [ -e "$var" ]; then
# something ...
fi
答案 1 :(得分:61)
来自bash
联机帮助页:
[[ expression ]]
- 根据条件表达式表达式的评估,返回0或1的状态。
而且,对于表达式,其中一个选项是:
expression1 && expression2
- 如果expression1
和expression2
都为真,则为true。
所以你可以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
答案 2 :(得分:8)
if [ -n "$var" -a -e "$var" ]; then
do something ...
fi
答案 3 :(得分:4)
只需引用您的变量:
[ -e "$VAR" ]
如果[ -e "" ]
为空,则评估为$VAR
。
您的版本无效,因为它的评估结果为[ -e ]
。现在在这种情况下,bash只检查单个参数(-e
)是否为非空字符串。
从联系手册:
测试和[根据参数个数使用一组规则评估条件表达式。 ...
1参数
当且仅当参数不为null时,表达式才为真。
(此外,此解决方案还具有使用包含空格的文件名的额外好处)
答案 4 :(得分: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似乎效率低下,但它有效......