我的unix脚本文件中有以下行:
if [[ -f $DIR1/$FILE1 ] -a [ -f $DIR1/$FILE2 ]]; then
清楚的是,行检查目录中是否存在两个文件,如果两个文件都存在,则会执行一些逻辑。
但是,在运行脚本时,我在上面的行中收到以下错误:
test_script: line 30: syntax error at line 54: `]' unexpected
第54行是上面一行的位置。
这个错误是什么意思?我哪里错了?
感谢阅读!
答案 0 :(得分:1)
对于最常见的shell,[]
与C中的括号不同,您可以使用它们对子表达式进行分组。
您需要的是(对于bash
):
if [[ -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ]]; then
如果您需要有关特定(非bash
)shell的帮助,您应该告诉我们您使用的是哪一个。
答案 1 :(得分:1)
不需要[]和-f。
if [ -f $DIR1/$FILE1 -a -f $DIR1/$FILE2 ]; then
输出:
shadyabhi@archlinux /tmp $ touch foo;touch foo2
shadyabhi@archlinux /tmp $ if [ -f "foo" -a -f "foo2" ]; then echo "Hello"; fi
Hello
shadyabhi@archlinux /tmp $
答案 2 :(得分:1)
有趣的是,有多个答案解释了[和[[,但由于某种原因我们的文化似乎阻止人们提供明显的解决方案]之间的微妙差异。完全停止使用'['。而不是'[',使用测试:
if test -f $DIR1/$FILE1 && test -f $DIR1/$FILE2; then
测试是比'['更清晰的语法,这需要最终的']'参数,并且不断让人们误以为括号是语言的一部分。 '[['不可移植,让那些没有意识到许多shell提供非标准功能的人感到困惑。有一种情况可以[[可以比[更高效,但是如果运行时性能是你的shell中的问题,你可能不应该在sh中解决问题。
答案 3 :(得分:0)
您有额外的[
和]
if [ -f $DIR1/$FILE1 -a -f $DIR1/$FILE2 ]; then
基本上,你混合了两种旨在做同样事情的语法:即[ ]
和[[ ]]
。前者更便携,但后者更强大;虽然您遇到的大多数炮弹都支持[[ ]]
。
但更好的是,因为您已经在使用[[ ]]
构造
if [[ -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ]]; then
答案 4 :(得分:0)
正如@paxdiablo所说,你可以这样使用它:
<?php
// DB connect
try {
$db = new PDO('mysql:host=localhost;dbname=DB_name', 'username', 'password');
// output as object
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
// error SQL as object
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->exec("SET CHARACTER SET utf8");
} catch (Exception $e) {
echo '<strong>'.$e->getMessage().'</strong><br />'."\n";
}
// default parameters
$param = array();
$sql = "SELECT * FROM `cars` WHERE `id` != '' ";
if(!empty($_POST['make'])){
$param[':make'] = $_POST['make'];
$sql .= 'AND `make` = :make ';
}
if(!empty($_POST['model'])){
$param[':model'] = $_POST['model'];
$sql .= 'AND `model` = :model ';
}
if(!empty($_POST['from'])){
$param[':from'] = $_POST['from'];
$sql .= 'AND :from >= coalesce(`from`, 0) AND :from <= coalesce(`to`, 9999) ';
}
// we prepare our request
$stmt = $db->prepare($sql);
// we execute with our parameters
$stmt->execute($param);
while($r = $stmt->fetch()){
echo $r->id.' - '.$r->make.' - '.$r->model.' - '.$r->from;
echo"</br>";
}
或者您可以这样使用它:
if -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ; then