Bash比较和表达式运算符


11

我是bash编程的新手。我已经阅读了两本不错的长篇指南,但是他们对运算符和关键字感到困惑。

哪个更普遍和广泛使用?我不知道什么时候使用以及为什么使用。

  1. test[[ ]]或者[ ]甚至(( ))
  2. $((exp)) 要么 $[exp]
  3. -gt或者>ge>=
  4. 何时使用<>( )以及何时必须使用\: \< \(etc 进行转义。
  5. ===(字符串比较)

我知道之间的基本区别[[[但其他问题对我来说还是个谜。

先感谢您


2
Greg的wiki是一个非常有用的,最新的Wiki,其中提到了很多好的做法。Bash指南和其中的FAQ特别有用。

Answers:


5
  • test是内置的shell,(显然)测试某些给定条件。一些较旧的Shell需要特殊命令。因此,您也可以在找到程序/usr/bin/test
  • [也是测试某些条件的程序。该软件还需要一个右括号,您可以在找到它/usr/bin/[
  • [[…]]是可替换的test[。它是针对Korn shell(ksh)开发的。但是您也可以在大于2的Bash版本和Z Shell中找到它。双括号具有一些漂亮的功能:
    • 外壳程序不进行分词或文件名扩展。
    • 您无需报价。
    • 可以使用或来代替-a(AND)或-o(OR)。&&||
    • =可以做更多的事情。
  • ((…))等同于let。因此基本上((expression))与相同let "expression"。但是,let可以使用多个表达式,但双括号仅允许一个表达式。
  • $((…))(以及$[…])进行一些计算。您的shell尝试计算括号内的表达式,并用结果替换该表达式。因此echo $((1+1))导致echo 2。因此,您的贝壳会打印数字2。

每次要比较两个数字时,都应使用带有破折号和两个字母(-ge-lt等等)的选项。如果要比较字符串,则应使用=!=

您关于转义的问题很难回答。因为它取决于您除了从外壳程序使用的软件。所以,即grepgrep -E需要不同的转义。这也符合的情况下sedawk他人和。因此,最好的选择是查看联机帮助页。一段时间后,您会习惯并知道何时使用转义。


谢谢。还有一个问题-因为可以使用((...))进行比较-使用该版本是否更常见:if((2> 1))或this:if [[2 -gt 1]]
MikeD

我认为这if [ 2 -gt 1 ]; …是更常见的,因为据我所知,这在POSIX兼容的外壳程序脚本中更常见。
qbi

要记住的另一件事是,如果expression的求值为/返回零,则[expression]为true;但是如果expression的求值为/返回非零,[(expression))为true。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.