Bash [[测试,引用变量

Rob*_*ino 5 bash

我想决定是否总是省略用Bash [[测试出现的变量的引号.我解释该man页面说允许这样做而不会丢失正确性.


我设计了这种简单的"测试"来验证我的想法和"预期的行为",但它可能完全没有任何证据,请看一下:

x='1 == 2 &&'; if [[ $x == '1 == 2 &&' ]]; then echo yes; else echo no; fi
Run Code Online (Sandbox Code Playgroud)

注意我不是这样写的:

x='1 == 2 &&'; if [[ "$x" == '1 == 2 &&' ]]; then echo yes; else echo no; fi
Run Code Online (Sandbox Code Playgroud)

到目前为止,这一直是我的风格,为了一致性,如果没有别的.


被安全地转我的编码约定,总是忽略了中出现的变量报价[[测试?

我正在努力学习Bash,我正努力做到这样做,养成良好的习惯,良好的风格和正确性.

orm*_*aaj 9

要记住的关键是在模式匹配上下文中引用和转义总是会导致其内容变为文字.引用上的左手侧==[[将没有必要,只有右侧被解释为图案.如果您想要文字匹配并且避免在变量中解释模式元字符,则必须在右侧进行引用.

换句话说,[ "$x" = "$x" ]并且[[ $x == "$x" ]]大多数是等同的,当然在Bash中,后者应该是首选.

一个小提示:想的运营商中的[[ ]]化合物,COMAND为同一语法明智的其它控制操作,例如elif,do,;;,和;;&(虽然在技术上,他们在自己的类是在手册中).它们实际上是复合命令部分的分界符,这就是它们如何实现看似神奇的属性,如短路扩展的能力.这应该有助于澄清很多行为[[,以及为什么它与例如算术运算符不同,后者不是那样的.

更多例子:http://mywiki.wooledge.org/BashFAQ/031#Theory


Fre*_*Ben 5

不。你不应该养成总是省略引号的习惯,即使它们出现在[[测试中。Bash 因不使用引号而烧死人而闻名:-)

在 bash 中,[[ ]]应该始终作为表达式求值因此脚本将继续运行。风险是逻辑错误可能会被忽视。在我能想到的所有情况下,这都可以。但是,引号允许您具体说明您想要的内容,并且除了更安全之外,还可以自我记录。

考虑这个表达式:

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

没有引号它仍然可以工作,因为它介于两者之间[[ ]],但引号正在澄清并且不会引起任何问题。

无论如何,这是我作为一个在 Bash 手中收到皇家软管的人的看法,因为我没有提供" "需要它们的东西:'(

我的 bash 黑客朋友曾经说过,“在 Bash 中大量使用引号。” 这个建议对我很有帮助。

  • 显式优于隐式,正如受 Python 启发的老式慢板。根据我的原始帖子,这就是我一直编码的方式。所以我**同意**你的看法。你知道,有时人们会因为 **UUOC** 而感到不安,所以..你不能取悦所有人.. (2认同)
  • 对我来说,隐式比显式更好。Bash 有很多上下文相关的细节。非常需要了解确切的规则。如果我看到一些潜在的冗余语法,那么不幸的是,我必须问自己,当编码人员将其放在那里时,他们是否知道他们在做什么。因为复杂的脚本可能会依赖于小细节,至少当我编写内容时,知道我在那里放置一些语法是有原因的会有所帮助。最好的风格可能取决于您的经验水平。 (2认同)