Answers:
if [ ! -z "$var" ] && [ -e "$var" ]; then
# something ...
fi
-a
。
从bash
联机帮助页:
[[ expression ]]
-根据条件表达式的计算结果,返回状态0或1。
并且,对于表达式,选项之一是:
expression1 && expression2
-如果trueexpression1
和expression2
true均为true。
因此,您可以and
按以下步骤将它们放在一起(-n
是的相反,-z
因此我们可以摆脱!
):
if [[ -n "$var" && -e "$var" ]] ; then
echo "'$var' is non-empty and the file exists"
fi
但是,我认为在这种情况下不需要它,-e xyzzy
如果xyzzy
文件存在并且可以很容易地处理空字符串,则为true 。如果这就是您想要的,那么您实际上不需要-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
bash
标签,并且没有提及POSIX,因此我发布了该版本,该版本可在bash
其他一些现代shell下使用。
bash
或其他现代外壳,则建议的理由就更少了-a
。
[ "$var1" -o "$var2" ]
; 如果var1=(
和var2=)
,那么我们有什么是是否测试-o
非空,而不是是否任一var1
或var2
不为空。这种含糊不清是x$var
成语在现代(即90年代后)test
命令中使用正确引号的唯一成因,并且该成语需要大火。
只需引用您的变量:
[ -e "$VAR" ]
计算结果为[ -e "" ]
if $VAR
为空。
您的版本无效,因为它的评估结果为[ -e ]
。现在,在这种情况下,bash仅检查单个参数(-e
)是否为非空字符串。
从联机帮助页:
使用基于参数数量的一组规则测试和评估条件表达式。...
1个论点
当且仅当参数不为null时,表达式才为true。
(此外,此解决方案还有使用包含空格的文件名的额外好处)
bash
; 中使用。但是,要充分利用“ bashisms”,请参阅@paxdiablo的答案。