unix脚本错误

时间:2012-01-31 07:01:38

标签: unix scripting

我的unix脚本文件中有以下行:

if [[ -f $DIR1/$FILE1 ] -a [ -f $DIR1/$FILE2 ]]; then

清楚的是,行检查目录中是否存在两个文件,如果两个文件都存在,则会执行一些逻辑。

但是,在运行脚本时,我在上面的行中收到以下错误:

test_script: line 30: syntax error at line 54: `]' unexpected

第54行是上面一行的位置。

这个错误是什么意思?我哪里错了?

感谢阅读!

5 个答案:

答案 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