如何在shell中测试变量是否等于数字


12

我有这个无效的shell脚本。

输入:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi

输出:

Server Name is 1

但是,如果我改变了Server_Name=2,输出是:

Server Name is 1

当我更改Server_Name为时2,我想说:Server Name is 2

我知道这是if [ $Server_Name=1 ];一部分。

我如何解决它?


正如David在下面指出的那样,您必须使用“ -eq”来测试数值。您可能还需要检查一个空白变量,以免出错。if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock

Answers:


21

您的脚本表明您正在使用字符串比较。

假设服务器名称可以是字符串而不是数字。

对于字符串比较
if [[ "$Server_Name" == 1 ]]; then

笔记:

  • 必须在==之间留有间距
  • 间隔= 必须
    if [ $Server_Name=1 ]; then是错误的

  • [[...]]减少了错误,因为[[和]]之间没有路径名扩展或单词拆分

  • 最好引用引号为“单词”的字符串

对于整数比较
if [[ "$Server_Name" -eq 1 ]]; then


更多信息:


2
[[是bash语法,OP询问了shell,它在哪里不起作用
gilad mayani


2
[ $Server_Name=1 ]

不能按预期工作,因为括号内的语法对Bash而言不是特殊的。像往常一样,变量$Server_Name将替换为1,因此test[)命令所看到的只是一个参数:string 1=1。由于该字符串的长度为非零,因此test返回true

对于兼容POSIX的外壳,可以使用以下测试命令:

[ "$Server_Name" = 1 ]

检查是否$Server_Name等于字符串1

[ "$Server_Name" -eq 1 ]

check是$Server_Name等于数字 1,即它执行数字比较而不是字符串比较。

例如,如果定义,则两个命令的返回值将有所不同Server_Name=01。第一个将返回false,第二个将返回true。

请注意,如果存在变量$Server_Name未定义的可能性,则必须将其用引号引起来,否则test在调用时将显示错误。


1

尝试,

 #!/bin/bash
 Server_Name=50
 if [ $Server_Name = 49 ]
 then
 echo "Server Name is 50"
 else
 echo "Server Name is below 50"
 fi

输出:

 #./scriptname.sh
 Server Name is below 50

0

简单的答案。您的代码是正确的-差不多了。您唯一缺少的是空格...(也许还有一个额外的“ =“)

if [ $Server_Name=1 ]; then

将无法正确计算。

if [ $Server_Name == 1 ]; then  

是您想要的。

现在,有关字符串与数字的声明。每当您像is / is-not这样搜索比较时,==总是很好。

而且我认为您始终将服务器名作为字符串而不是数字-对吗?;-)

祝您编码坚固的徒弟好运。

再见


惊人的这么多的答案有在这里..
Tobibobi
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.