LINUX.ORG.RU

if..else..fi не работает

 


0

1

Работает

#!/bin/sh
if [ $num -eq 2 ]; then
  somecode
#else
# anycode
fi

Не работает

#!/bin/sh
if [ $num -eq 2 ]; then
  somecode
else
# anycode
fi

Перестаёт работать весь код сразу после строки IF, как только снимаю коммент с ELSE. Почему?


Ответ на: комментарий от gnunixon

не важно. в любом случае не работает. там вот так:

else
    [ $DEBUG ] && echo No XLS file(s) found. col=$col, row=$row, keyword=\"$keyword\" OK=\"$OK\" >> $debug_lo
    [ -f $mail_cur/$mail_file ] && rm -f $mail_cur/$mail_file # Удаляем плохое письмо, если оно естиь и если это файл
    msg="$msg\n$(date '+%b, %d%t%X') -- $Uscript no XLS file(s). $mail_file removed"
fi

тоже не работает

MAGNet
() автор топика
Ответ на: комментарий от TalkingMudcrab

Не работает

[ $DEBUG ] && echo "$(date '+%b, %d%t%X') -- START script \"$script\"" >> $debug_log
# Вытащим вложенные xls-файлы из письма, запишем количество полученных файлов в переменную num
num=`\
    i=0; \
    munpack -fq $mail_cur/$mail_file -C $fldtmp 2> $debug_log | grep '^.*(application/vnd.ms-excel)$' | \
        (while read file mime; do \
            (( i+=1 )); \
            mv -f "$fldtmp/$file" "$script$i"_orig.xls; \
        done; \
        [ $DEBUG ] && echo "$i Files found. Operations finished" >> $debug_log; \
        echo $i) \
    `
[ $fldtmp ] && [ -d $fldtmp ] && rm $fldtmp/* -rf # очистим временную папку, если она существует и если это папка

# Проверить наличие нужных вложенных файлов, сравнить с количеством ожидаемых
[ $DEBUG ] && echo "$num fles found" >> $debug_log
if [ $num -eq 2 ]; then
    [ $DEBUG ] && echo "Under IF $num fles found" >> $debug_log
    sscript=$script # сохраним имя скрипта
    for (( i=1; i<=$num; i++ )); do
        unset OK
        script=$sscript$i # переопределим имя скрипта под номером обрабатываемого файла
        [ $DEBUG ] && {
            echo  file "$script"_orig.xls >> $debug_log
            [ -f "$script"_orig.xls ] && echo File exist >> $debug_log
        }

	    date=`ls -l --time-style=long-iso "$script"_orig.xls | awk '{print $6 " " $7}'`
        [ $DEBUG ] && echo Starting $date >> $debug_log
#
# Проверка колонки остатков
#
# Ищем ключевые слова
        keyword=('Наличие на складе')
        for row in {1..20}; do
            for col in {1..20}; do
                [ $DEBUG ] && echo col=$col, row=$row, keyword=$keyword >> $debug_log
                if [ "`xls2csv -c\@ -q0 "$script"_orig.xls | awk -v col="$col" -v row="$row" -F "@" 'NR == row { print $col }'`" = "$keyword" ]; then
				    msg="$msg\n$(date '+%b, %d%t%X') -- $Uscript Keyword \"$keyword\" found on row $row, col $col for file "$script"_orig.xls"
                    source $fldscr/$sscript.scheme
                    OK=1
                fi
                [ $OK ] && break
            done
            [ $OK ] && break
        done
# Если ключевых слов не найдено - рапортуем об ошибке и выходим
        if ! [ $OK ]; then
            msg="$msg\n$(date '+%b, %d%t%X') -- $Uscript script ERROR! Keywords not found. Do nothing"
		    echo -e $msg >>$log
            [ $DEBUG ] && echo Keywords not found col=$col, row=$row, keyword=\"$keyword\" OK=\"$OK\" >> $debug_log
		    mail -A "$script"_orig.xls -s "$Uscript script: parsing ERROR! Keywords not found" "$mail_allert"
            exit 1
        fi
# Дополнительно проверим, не пустой ли CSV-файл получился?
# Если файл пустой, то процедура завершится с ошибкой
	    source $fldscr/testcsv.sh
# Конвертация из CSV в XLS
    	unoconv -i FilterOptions=44,,cp1251,1 -f xls "$script"_4xls.csv
# Выгрузка в обменник на DC1
	    smbclient '\\sr-dc1\exchange' -U 'geltd\1c-robot' g0xnfkmq0y -c \
            "put "$script"_4xls.xls \"Остатки\Эра\остатки ЭРА"$i".xls\"; put "$script"_orig.xls \"Остатки\Эра\остатки ЭРА"$i"_orig.xls\"; exit" 2>/dev/null
# Выгрузка на ОРК
        source ork_ftp_upload.script
    done
# Завершение обработки
    msg="$msg\n$(date '+%b, %d%t%X') -- $Uscript script finished"
else
    [ $DEBUG ] && echo No XLS file(s) found. col=$col, row=$row, keyword=\"$keyword\" OK=\"$OK\" >> $debug_lo
    [ -f $mail_cur/$mail_file ] && rm -f $mail_cur/$mail_file
    msg="$msg\n$(date '+%b, %d%t%X') -- $Uscript no XLS file(s). $mail_file removed"
fi

Работает с таким исправлением


    msg="$msg\n$(date '+%b, %d%t%X') -- $Uscript script finished"
#else
#    [ $DEBUG ] && echo No XLS file(s) found. col=$col, row=$row, keyword=\"$keyword\" OK=\"$OK\" >> $debug_lo
#    [ -f $mail_cur/$mail_file ] && rm -f $mail_cur/$mail_file
#    msg="$msg\n$(date '+%b, %d%t%X') -- $Uscript no XLS file(s). $mail_file removed"
fi
MAGNet
() автор топика

Надо смотреть на сообщение об ошибке, а не жаловаться «не работает». Сообщение об ошибке:

./test.sh: line 6: syntax error near unexpected token `fi'
./test.sh: line 6: `fi'

До «работы» здесь даже не доходит. Баш не может распарсить твой код. Причём говорит тебе, что проблема в синтаксисе, а именно, fi здесь не ждут.

А теперь, понимая ситуацию, man bash. Во-первых, синтаксис if:

if list; then list; [ elif list; then list; ] ... [ else list; ] fi

Во-вторых:

A list is a sequence of one or more pipelines

Жирный шрифт мой. Дальше жевать или сам?

debugger ★★★★★
()
Последнее исправление: debugger (всего исправлений: 2)
Ответ на: комментарий от xaizek

YES! я сам уже до этого додумался )) спасибо, дружище! заметил ))

MAGNet
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.