我创建了一个简单的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
我错过了什么?
答案 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控制结构的基本原则。
在if
和then
关键字之间,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
它解决了我的问题。谢谢大家。