【发布时间】:2012-02-13 18:27:37
【问题描述】:
我想我不清楚如何进行“和”测试。我想确保存在一个与[ -e $VAR ] 配合良好的论点,但事实证明它在空字符串上也被评估为真;这是我不想要的。
我如何将它们“和”在一起?或者是否有另一个一元测试可以完成我想要的?
【问题讨论】:
我想我不清楚如何进行“和”测试。我想确保存在一个与[ -e $VAR ] 配合良好的论点,但事实证明它在空字符串上也被评估为真;这是我不想要的。
我如何将它们“和”在一起?或者是否有另一个一元测试可以完成我想要的?
【问题讨论】:
if [ ! -z "$var" ] && [ -e "$var" ]; then
# something ...
fi
【讨论】:
bash;但是,要充分利用“bashisms”,请参阅@paxdiablo 的回答。
-a。
来自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
但是,我认为在这种情况下不需要它,如果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" ]] && echo "'$var' exists"缩短它
if [ -n "$var" -a -e "$var" ]; then
do something ...
fi
【讨论】:
POSIX 没有定义[ 的行为与复杂的测试集,我们应该避免使用-a 或-o 和[。我读了here。
bash 标签并且没有提到POSIX,所以我发布了这个在bash 和其他一些现代shell 下工作的版本。
bash 或其他现代shell,那么推荐-a 的理由甚至更少。
[ "$var1" -o "$var2" ];如果var1=( 和var2=),那么我们需要测试-o 是否为非空,而不是var1 或var2 是否为非空。这种歧义是现代(即 90 后)test 命令中 x$var 成语正确引用的唯一正当理由,而该成语需要在火灾中消亡。
简单地引用你的变量:
[ -e "$VAR" ]
如果$VAR 为空,则计算结果为[ -e "" ]。
您的版本不起作用,因为它的计算结果为 [ -e ]。现在在这种情况下,bash 只检查单个参数 (-e) 是否为非空字符串。
来自手册页:
test 和 [ 使用一组基于参数数量的规则来评估条件表达式。 ...
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
有没有关于那个的cmets? grep 两次似乎效率低下,但确实有效...
【讨论】: