gpt4 book ai didi

bash 如果有 or 和否定

转载 作者:行者123 更新时间:2023-11-29 08:49:27 25 4
gpt4 key购买 nike

为什么:

#!/bin/bash
wtf=false
if [ $wtf ] || [ ! -f filethatexists.whatever ]
then
echo "WTF1"
fi
if [ ! -f filethatexists.whatever ]
then
echo "WTF2"
fi

打印:

WTF1

而不是什么都没有?尤其令人困惑的是,第二种形式按预期工作,而第一种形式却没有。

最佳答案

基本测试

[ $wtf ]

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

由于 $wtf 包含字符串 'false',测试返回 true,或成功退出状态 0,因为 'false'与空字符串 '' 不同——因此您得到 WTF1 作为响应。

尝试:

wtf=''

正如 Gordon Davisson 指出的那样(和 Dennis Williamson ),小心处理正在测试的字符串是个好主意。事实上,我应该声明我会一直使用 [ -n "$wtf"][ -z "$wtf"] 来测试是否设置了变量,因为那是我在四分之一个世纪前学习 shell 时所必需的。我从 Bash 爱好者那里得到了反驳的故事,你不必在 Bash 中担心它 - 但是,我认为这里的代码提供了一个反例,实际上你仍然需要担心它。

因此,一些最佳实践:

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

规则可能有异常(exception) - 但遵循它们不会出错。

考虑代码:

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"

产生:

WTF1
WTF2
WTF3
WTF6
WTF7

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

您可以扩展测试以涵盖更多令人作呕的案例。

关于bash 如果有 or 和否定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3800158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com