从bash到ksh - 脚本抛出错误但仍然有效

时间:2013-11-08 18:09:13

标签: ksh

我创建了一个简单的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 个答案:

答案 0 :(得分: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

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

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

但要完全循环,你实际上只需要:

if sftp -b "$connect_string" 2>&1 
then
    ...
fi

答案 1 :(得分: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

答案 2 :(得分:0)

看来你正在努力克服bash / ksh控制结构的基本原则。

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

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

示例:

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

相当于:

$ test a == a
$ echo $?
0
$ test a == b
$ echo $?
1

答案 3 :(得分:-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

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