【问题标题】:"Command not found" when attempting integer equality in bash在 bash 中尝试整数相等时出现“找不到命令”
【发布时间】:2010-12-17 08:35:15
【问题描述】:

好的,这对于在 bash 上花费的时间比我多的人来说可能是非常明显的。

我正在尝试运行此代码:

#!/bin/bash

if ["1" -eq "2"] 
then
    echo "True"
else
    echo "False"
fi

但是当我执行文件时,它会发回

./test.sh: line 3: 1: command not found
False

一定有什么重要的东西我错过了。我见过人们在括号后使用分号,这似乎没有任何区别......:S

【问题讨论】:

  • [ 是一个程序,试试which [ 你会看到。而且您不能执行带有不带空格的参数编写的程序...(正如其他人所回答的那样,-eq 仅适用于整数。使用 [ 正确时它会告诉您)
  • 大家都说过[后面需要一个空格。 原因[ 是一个命令——它是test 的别名。现在它是一个内置的 shell,但你可以在大多数系统上找到 /bin/[
  • @plundra:那些整数。请参阅我对 RageZ 答案的评论。
  • bash, command not found 的可能重复项

标签: bash


【解决方案1】:

您需要在[ 之后和] 之前添加一个空格,如下所示:

if [ "1" -eq "2" ]

但是,这种方式已被弃用,更好的使用方法是:

#!/bin/bash

if ((1 == 2)) 
then
    echo "True"
else
    echo "False"
fi

【讨论】:

  • 您能否详细说明该更改,在什么情况下这是一个有效的声明?哪些贝壳?
  • @tvCa 你指的是哪个语句,[(( )) 后面需要空格?
  • 是的......我的意思是使用 (( )) 而不是 [ ] - 根据我的阅读,[ ] 的替换是 [[ ]] - 而不是 (( ))
  • @tvCa In bash (( )) 用于算术评估,这正是 OP 想要做的。
【解决方案2】:

是的 eq 仅用于算术比较。

对于字符串比较,您必须使用=

#!/bin/bash

if [ "1" = "2" ] 
then
    echo "True"
else
    echo "False"
fi

另外,括号周围需要一些空间。

【讨论】:

  • 数字是 shell 中的字符串。引号不会改变它们是数字的事实。 [ 10 -gt 2 ] 是真的。另一方面,Comparisons 可以用于字符串或数字。一个例子,你已经展示了。其他特定于支持[[ 的shell:字符串:[[ "10" > "2" ]] (false) 或[[ "10" -gt "2" ]] (true)。再次强调,不同的不是引号。
  • 空格!我知道这将是一件小事。人们抱怨 python 的 使用重要的空格。 :S
  • @Margaret Heh。 shell 所做的很奇怪的事情是 [ 不是语法,而是一个常规命令(就解析器而言;实际上有一个内置的实现,所以 /bin/[/usr/bin/[ 不被普通 shell 使用,但这只是性能优化)。在命令名称和它的参数之间需要一个空格是完全正常的。
【解决方案3】:

尝试在括号周围添加空格:

if [ "1" -eq "2" ]

【讨论】:

    猜你喜欢
    • 2019-12-26
    • 2012-03-06
    • 1970-01-01
    • 2012-02-08
    • 2019-09-09
    • 1970-01-01
    • 2018-01-17
    • 2021-11-22
    • 2022-01-16
    相关资源
    最近更新 更多