0

我创建了一个简单的 BASH 脚本,它每小时检查远程服务器上是否存在文件。直到我被要求将其移动到运行 KSH 的服务器之前,它都可以正常工作。

出错的代码部分是这个:

connect_string=$UID@$SERVER:$srcdir/$EVENTFILE
result=`sftp -b "$connect_string" 2>&1`

if [ echo "$result" | grep "not found" ]; then
  echo "not found"
else
  echo "found"
fi

这些是它抛出的错误:

-ksh: .[51]: [: ']' missing
grep: ]: No such file or directory
found

它仍然运行并确认我正在轮询的文件在那里,但我需要解决这个问题。我像这样更改了 if 语句

if [[ echo "$result" | grep "not found" ]]; then

但它立即失败并出现此错误

-ksh: .: syntax error: `"$result"' unexpected

我错过了什么?

4

4 回答 4

1

您的基本语法假设if不正确。旧[...]语法,调用test内置[[...]]函数,用于文本模式匹配。

正如@shelter 的评论,正确的语法是:

connect_string="$UID@$SERVER:$srcdir/$EVENTFILE"
result=`sftp -b "$connect_string" 2>&1`

if echo "$result" | grep "not found" ; then
    echo "not found"
else
    echo "found"
fi

但这是一个不必要的使用外部grep程序,可以使用shell文本比较:

if [[ $result == *not\ found* ]] ; then
    echo "not found"
else
    echo "found"
fi

(用 bash 和 ksh 测试过)

您的解决方案:

EXIT=`echo $?`
if [ $EXIT != 0 ]
then
    ...
fi

可以改进。首先,如果您要进行算术比较,请使用((...)), not test,我无法弄清楚为什么您有EXIT变量:

if (( $? != 0 ))
then
    ...
fi

但要绕一圈,你实际上只需要:

if sftp -b "$connect_string" 2>&1 
then
    ...
fi
于 2013-11-11T14:09:33.507 回答
0

看来您正在为 bash/ksh 控制结构的基本原则而苦苦挣扎。

ifthen关键字之间,shell 需要一个或多个commands,系列中的最后一个命令决定if语句的处理方式。

仅当您确实需要执行比较时才需要方括号。在内部,它们等价于test命令 - 如果比较成功,则退出状态为 0。

例子:

$ [ a == a ]
$ echo $?
0
$ [ a == b ]
$ echo $?
1

这相当于:

$ test a == a
$ echo $?
0
$ test a == b
$ echo $?
1
于 2013-11-14T20:31:17.323 回答
0
echo "$result" | grep "not found"
#capture exit status code from previous command ie grep.
if [[ $? == 0 ]]
than
 echo "not found"
else
 echo "found"
fi
于 2013-11-08T18:22:23.723 回答
-1

我改变了我的方法。

connect_string=$UID@$SERVER:$srcdir/$EVENTFILE
result=`sftp "$connect_string" 2>&1`
EXIT=`echo $?`
if [ $EXIT != 0 ]
then
                        echo "file not found"
                        exit 1
else
                        echo "file found"
                        exit 0
fi

它解决了我的问题。谢谢大家。

于 2013-11-08T19:24:52.160 回答