2013-11-08 2 views
0

Я создал простой скрипт BASH, который каждый час проверяет наличие файла на удаленном сервере. Он работал безошибочно, пока меня не попросили переместить его на сервер, на котором запущен KSH.От bash до ksh - скрипт вызывает ошибки, но все еще работает

Часть кода, ошибки отказа это одна:

[email protected]$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 [[ echo "$result" | grep "not found" ]]; then 

, но он не сразу с этой ошибкой

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

Что мне не хватает?

+0

'если 'проверяет код возврата последней команды, выполненной для предоставленного списка. поэтому 'if echo" $ result "| grep «не найден»; то «должно быть достаточно. Удачи. – shellter

ответ

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 
-1

Я изменил свой подход к этому вопросу.

[email protected]$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 

Это позаботится о моей проблеме. Спасибо всем.

+0

Прочтите ответ от @cdarke: Его 'if sftp -b '$ connect_string" 2> & 1; то «... это все, что вам действительно нужно. –

1

Неправильные базовые предпосылки синтаксиса для if. Старый синтаксис [...], вызывает test встроенный, и [[...]] предназначен для сопоставления текстового рисунка.

Как комментарий @ приюта, правильный синтаксис:

connect_string="[email protected]$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 программы, вы можете использовать текстовую оболочку сравнения:

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

(тестирование с Баш и КШ)

Ваше решение:

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

Может быть улучшено. Во-первых, если вы собираетесь делать арифметическое сравнение, а затем использовать ((...)), не test, и я не могу понять, почему у вас есть EXIT переменную:

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

Но идти полный круг, вы на самом деле только нужно :

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

Похоже, вы боретесь с основным принципом структур управления bash/ksh.

Между if и then ключевых слов, оболочка ожидает один или несколько команд, с последней команды в серии отступали как обрабатывается if заявление.

Квадратные скобки необходимы, только если вам действительно необходимо выполнить сравнение . Внутренне они эквивалентны команде test - если сравнение успешно, она приводит к статусу выхода из 0.

Пример:

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

Что эквивалентно:

$ test a == a 
$ echo $? 
0 
$ test a == b 
$ echo $? 
1 
Смежные вопросы