【问题标题】:what does the condition "\>" mean in an if statement in bash?bash 中的 if 语句中的条件“\>”是什么意思?
【发布时间】:2021-09-18 06:33:04
【问题描述】:

您好,我似乎在任何地方都找不到这个。这个正斜杠在 bash 的 if 语句中是什么意思?

例如:

if [ "$count" \> 0 ]; then
echo hello
else
echo goodbye
fi

【问题讨论】:

  • 这是什么编码语言?我怀疑 \ 是在实际语言之外且与实际语言无关的另一个上下文所需的转义。
  • 嗨,这是在 bash 中。
  • 在 shell 脚本中比较数字时,通常需要使用-gt-lt-le、-ge, -ne, or -eq`
  • 这是[ 语法,而不是if 语法。

标签: linux bash shell if-statement conditional-statements


【解决方案1】:

字符<>(以及其他字符)在shell 脚本中是特殊的:它们执行输入/输出重定向。所以当你试图在这样的测试表达式中使用它们时,它们的“正常含义”是“小于”和“大于”,你需要转义它们,防止它们被外壳经过特殊处理。

这和你写的方式很相似

cat file\ name

对名称中带有空格的文件进行分类,或

cat it\'s

对名称中包含单引号字符的文件进行分类。 (也就是说,通常,空格字符是“特殊的”,因为它分隔参数,单引号字符是特殊的,因为它引用了一些东西,所以要允许这些字符实际用作文件名的一部分,你有引用它们,在这种情况下使用\ 来关闭它们的特殊含义。)

在 Unix/Linux shell 中引用最终变得复杂,因为通常有 三个 不同的引用字符:"'\。它们的工作方式都不同,而且规则(虽然它们大多是有意义的)足够复杂,我不打算在这里重复它们。

另一种避免丑陋引用的写法是

if [ "$count" -gt 0 ]

事实证明这是更可取的另一个原因。如果您使用-gt,它将根据$count0numeric 值进行比较,这大概就是您想要的。另一方面,如果您使用>(即\>),它将执行字符串比较。在这种情况下,您可能会得到相同的结果,但一般来说,当您打算进行数字比较时进行字符串比较会产生疯狂的结果。有关示例,请参见 Charles Duffy 的评论。

【讨论】:

  • [ "$count" -gt 0 ][ "$count" \> 0 ] 执行两个不同的操作。 -gt 是数字比较,\> 是字符串排序比较——它们不是同义词。
  • @CharlesDuffy 我不知道。 (直到今天我才意识到 test(1) 完全接受了<>。)谢谢。我会解决的。
  • 举一个具体的例子来说明它们何时有不同的结果,比较[ 3 \> 10 ][ 3 -gt 10 ]。前者是正确的,因为3 的ASCII 序号比1 高,而且它是逐字符比较的;后者为假,因为310 小。
  • (回复:“从未实现”--> 是一个非标准扩展,因此不保证存在)
  • 使用[[ 的好处之一是> 这样的运算符不需要像这样转义。
【解决方案2】:
  • \>表示大于 ASCII 字母表中的字符串
  • BASH 对于反斜杠符号有不同的含义\
  • 在您的示例中,\> 是一个符号,而不是像 \ + > 这样的两个东西
  • 对于数字,您使用>,但还要考虑[ ] 用于算术运算,您将使用(( ))
  • bash 中的构造函数带有此符号 [[ ]] 它用于与双括号内的这些符号进行比较
    • &&, ||, <, and >
    • 如果您在上面的符号中使用单括号 [ ],则会在 BASH 脚本中出现错误,您需要使用双括号。

BACKSLASH 的其他含义

  • 如前所述,在 bash 中,您使用正斜杠 / 表示 PATH /home/user/Desktop/file1.txt,但如果您的文件 NAME 有空格,则需要转义空格,并使用反斜杠 \ 进行操作,例如给出

带空格的文件名.txt

  /home/alex/Desktop/file\ name\ with\ spaces.txt  

带符号的文件名 -> [Stackoverflow]fileName.txt

 /home/alex/Desktop/\[Stackoverflow\]fileName.txt 

您需要转义每个 BRACKET [ ] LIKE this \[ \]

资源

Bash Constructors | Bash operators | Ascii Table

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多