首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash if with or and negation

bash if with or and negation
EN

Stack Overflow用户
提问于 2010-09-27 06:53:24
回答 3查看 48.2K关注 0票数 12

为什么:

代码语言:javascript
复制
#!/bin/bash
wtf=false
if [ $wtf ] || [ ! -f filethatexists.whatever ]
then
 echo "WTF1"
fi
if [ ! -f filethatexists.whatever ]
then
 echo "WTF2"
fi

打印:

WTF1

而不是什么都不做?尤其令人困惑的是,第二种形式的工作方式与预期的一样,而第一种形式则不然。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-27 06:55:23

基本测试

代码语言:javascript
复制
[ $wtf ]

测试中间的字符串是否为空。

因为$wtf包含字符串'false',所以测试返回true,如果成功,则返回退出状态0,因为'false'与空字符串''不同-因此您将获得WTF1作为响应。

尝试使用:

代码语言:javascript
复制
wtf=''

正如Gordon Davisson (和Dennis Williamson)所指出的,谨慎对待正在测试的字符串是一个好主意。实际上,我应该说明我总是使用[ -n "$wtf" ][ -z "$wtf" ]来测试是否设置了变量,因为在25年前我还在学习shell时,这是必要的。我从Bash的爱好者那里得到了一些相反的故事,他们说在Bash中你不必担心它--然而,我认为这里的代码提供了一个反例,实际上你仍然需要担心它。

因此,以下是一些最佳实践:

  • 用双引号括起被测试的变量,或使用
  • (在Bash中),使用[[ $wtf ]],它知道如何处理-n-z测试的变量,以测试非空或空值。

这些规则可能会有例外--但遵循它们不会错得太远。

考虑下面的代码:

代码语言:javascript
复制
wtf="1 -eq 0"
 [  $wtf  ]  && echo "WTF0"
[[  $wtf  ]] && echo "WTF1"
wtf="false"
 [  $wtf  ]  && echo "WTF2"
[[  $wtf  ]] && echo "WTF3"
wtf=""
 [  $wtf  ]  && echo "WTF4"
[[  $wtf  ]] && echo "WTF5"
wtf="false"
 [ "$wtf" ]  && echo "WTF6"
[[ "$wtf" ]] && echo "WTF7"
wtf=""
 [ "$wtf" ]  && echo "WTF8"
[[ "$wtf" ]] && echo "WTF9"

这会产生以下结果:

代码语言:javascript
复制
WTF1
WTF2
WTF3
WTF6
WTF7

同时使用bash和ksh (当使用'bash testcode.sh‘或'ksh testcode.sh’运行时,可以在MacOS X 10.6.4上找到)。一个真正的Bourne shell (如果你仍然可以找到这样的东西)会反对双括号操作-它将无法在$PATH上找到命令'[[‘。

您可以扩展测试以涵盖更多令人反胃的情况。

票数 10
EN

Stack Overflow用户

发布于 2010-09-27 07:40:46

这里有一个很方便的小技巧:

代码语言:javascript
复制
wtf=false
if $wtf || [ ! -f filethatexists.whatever ]

在这种形式下,执行变量的内容,返回值决定测试是通过还是失败。碰巧truefalse都是返回适当值的Bash内置函数。

票数 4
EN

Stack Overflow用户

发布于 2010-09-27 06:58:02

if [ $wtf = true ] || [ ! -f . .

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3800158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档