如何在Shell脚本中进行比较?

8
如何在shell脚本中进行比较?
或者说,为什么下面的脚本没有输出?
x=1
if[ $x = 1 ] then echo "ok" else echo "no" fi

5
如果 [ $x = 1 ]; 那么在 ] 后需要加上分号 ; ,并且在 if 后面需要加上一个空格,然后执行语句:如果成立则输出 "ok",否则输出 "no"。完整代码如下:if [ $x = 1 ]; then echo "ok"; else echo "no"; fi - Sergio
@Sergio 它会显示 bash: syntax error near unexpected token \then'`。 - The Student
@Hossein 它显示 1=1: 命令未找到 - The Student
也许我的bash文件(在系统上)有一些问题? - The Student
4个回答

12

使用 -eq, -ne, ... 来比较数字,表示相等、不相等等。

x=1
if [ $x -eq 1 ]
then 
  echo "ok" 
else 
  echo "no" 
fi

对于其他情况,请使用 == 而不是 =


通过使用-eq和]后面的;,它会出现“bash:syntax error near unexpected token 'then'”的语法错误。 - The Student
是的,事实上,在每个“ [ ”之前和之后都必须留出一个“空格”...我刚刚编辑了一段有效的代码。 - William Durand
4
@Tom 不要使用 '==' 替代 '='。不管是内置的还是外置的,'test' 命令(也被称为 '[')通常接受 '==',但是 '=' 更加通用。不必要地使用 '==' 会限制脚本的可移植性。 - William Pursell

6

快速解决方案:使用快捷键AND和OR:

x=1
(( $x == 1 )) && echo "ok" || echo "no"

2
您可以使用shell中的两种方法进行比较:
  1. 单方括号语法(if [ ]
  2. 双圆括号语法(if (( ))

使用单方括号语法

运算符 :-

-eq 等于

-ne 不等于

-gt 大于

-ge 大于或等于

-lt 小于

-le 小于或等于

在您的情况下:

x=1
if [ $x -eq 1 ]
then 
  echo "ok" 
else 
  echo "no" 
fi

双括号语法

双括号结构也是 Bash 允许变量进行类似 C 语言操作的机制,例如:(( var++ ))。

在您的情况下:

x=1
if (( $x == 1 )) # C like statements 
then
    echo "ok"
else
    echo "no"
fi

1

这取决于编程语言。在bash中,您可以使用==运算符。否则,您可以使用-eq -lt -gt来表示等于、小于、大于。

$ x=1
$ if [ "$x" == "2" ]; then echo "yes"; else echo "no"; fi
no

编辑:添加了 == 周围的空格并进行了2次测试。


1
你需要在“==”周围加上空格--尝试使用[ "$x"=="2" ]命令,你会发现这也是正确的。你需要使用[ "$x" = "1" ][ $x -eq 1 ],或者在bash中使用[[ $x == 1 ]](( x == 1 )) - glenn jackman
谢谢你指出手动缩进的问题,不过 [ ] 也可以。 - Aif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接