如果不被空间包围,为什么等于运算符不起作用?

时间:2011-02-12 09:37:36

标签: bash shell syntax scripting

我尝试了以下脚本

#!/bin/bash
var1="Test 1" 
var2="Test 2"
if [ "$var1"="$var2" ] 
  then 
    echo "Equal" 
  else 
    echo "Not equal"
fi

它给了我Equal。虽然它应该打印Not equal

只有当我在=周围插入空格时,它才能按预期工作

if [ "$var1" = "$var2" ] 

并打印Not equal

为什么会这样?为什么"$var1"="$var2""$var1" = "$var2"不一样?

此外,当我写if [ "$var1"= "$var2" ]时,它给出了

line 4: [: Test 1=: unary operator expected

这是什么意思?它如何期待一元运算符?

4 个答案:

答案 0 :(得分:58)

test(或[ expr ])是内置函数。与bash中的所有函数一样,您将其参数作为空格分隔的单词传递。

由于bash builtins的手册页指出:“每个运算符和操作数必须是一个单独的参数。”

这就是bash和大多数其他Unix shell的工作方式。

变量赋值不同。

在bash中,变量赋值的语法为:name=[value]。你不能在=周围放置不带引号的空格,因为bash不会将此解释为你想要的任务。 bash将大多数单词列表视为带参数的命令。

E.g。

# call the command or function 'abc' with '=def' as argument
abc =def

# call 'def' with the variable 'abc' set to the empty string
abc= def

# call 'ghi' with 'abc' set to 'def'
abc=def ghi

# set 'abc' to 'def ghi'
abc="def ghi"

答案 1 :(得分:7)

当shell读取

if [ "$var1" = "$var2" ]

它调用命令[带有4个参数。无论是内置命令还是外部命令都无关紧要,但它可能有助于理解它可能是外部命令/ bin / [。第二个参数是文字'=',第四个参数是']'。但是,当shell读取时

if [ "$var1"= "$var2" ]

[只获得3个参数:附加'='的$ var1的扩展,$ var2的扩展和']'。当它只获得3个参数时,它期望最后一个参数为']',第一个参数为一元运算符。

答案 2 :(得分:3)

要添加到现有解释中,"$var1"="$var2"只是一个非空字符串,因此在条件语句中始终计算为true。

[ "$var1"="$var2" ] && echo true

以上命令将始终打印true(即使var1var2为空)。

答案 3 :(得分:-1)

在bash中,最好的是使用[[]]:

//not tested

$app->get('/data', function () use ($app) {
    //pls validate that are numbers
    $page = (isset($_GET['page']) && $_GET['page'] > 0) ? $_GET['page'] : 1;
    $limit = isset($_GET['limit']) ? $_GET['limit'] : 10;

    $offset = (--$page) * $limit; //calculate what data you want
    //page 1 -> 0 * 10 -> get data from row 0 (first entry) to row 9
    //page 2 -> 1 * 10 -> get data from row 10 to row 19

    $countQuery = $stmt->prepare('SELECT COUNT(*) FROM table');
    $dataQuery = $stmt->prepare('SELECT * FROM table LIMIT :limit OFFSET :offset');
    $dataQuery->bindValue(':limit', $limit, \PDO::PARAM_INT); 
    $dataQuery->bindValue(':offset', $offset, \PDO::PARAM_INT); 

    try {
        $count = $countQuery->execute();
        $data = $dataQuery->execute();
    } catch(PDOException $e) {
        die('Error.');
    }
    $app->render('data.html', array(
        'data' => $data,
        'count' => $count
    ));
});