我尝试了以下脚本
#!/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
这是什么意思?它如何期待一元运算符?
答案 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
(即使var1
和var2
为空)。
答案 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
));
});