【问题标题】:What does it mean in bash [ "abc" < $bar ]?bash [ \"abc\" < $bar ] 是什么意思?
【发布时间】:2022-11-18 01:44:02
【问题描述】:

目前,我正在学习 bash。我想知道 [ "abc" &lt; $bar ] 命令是什么意思。我知道 [] 比较或测试它们的值。但是 &lt; 运算符如何在 abc 字符串和 $bar 变量之间工作 你能描述一下吗?

【问题讨论】:

  • &lt; 是输入重定向运算符。所以这是从文件名$bar]读取输入
  • 我怀疑那是实际的代码。当您使用 [] 时,您必须在它们周围留出空格。请发布minimal reproducible example
  • ["abc" 只会导致 bash: [abc: command not found。有一个名为[的命令,[后必须有一个空格。请准确复制命令。请确认是否有[[[((,字符很重要。
  • @KamilCuk 编辑。

标签: bash


【解决方案1】:

[ "abc" &lt; $bar ] 看起来是程序员的错误。我们可以改写成[ "abc" ] &lt; $bar,意思完全一样。

&lt; 是一个重定向运算符,用于从名为 $bar 的文件中读取输入。 [ 命令忽略标准输入,因此任何输入都将被忽略。如果$bar 变量为空,它将写入bash: $bar: ambiguous redirect 消息。

然后[ "abc" ] 检查abc 是否为非空字符串。它不是一个空字符串,所以 [ "abc" ] 返回零退出状态意味着成功。

如果代码的作者打算按字典顺序比较字符串与[,他应该写成[[ "abc" &lt; "$bar" ]][ 命令不支持 &lt; 运算符(参见 POSIX standard,事实上 POSIX 提到它不包括在内。)。在 Bash 中,[ "abc" '&lt;' "$bar" ] 可以工作,因为 [[[ 的内置别名(请参阅 type [ 的输出)。

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2012-04-19
    • 2012-05-12
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多