2017-02-22 45 views
1
filecount=0 
if [ -e "$filename$ext" ] 
    then 
    ls -l $filename$ext 
    scp $filename$ext [email protected]:/home/t2flex/. 
    mv $filename$ext $filename"_"$d$done 
    echo $filename$ext secure copied to ccfilesvr 
    filecount=$((filecount+1)) 
else 
    echo "$filename$ext Not found in $path." 
fi | tee >> $logfile 
# ----------------------------------------------------- 
if [ -e "$filenam1$ext" ] 
    then 
    ls -l $filenam1$ext 
    scp $filenam1$ext [email protected]:/home/t2flex/. 
    mv -f $filenam1$ext $filenam1"_"$d$done 
    echo "$filenam1$ext secure copied to ccfilesvr" 
    filecount=$((filecount+1)) 
else 
    echo "$filenam1$ext Not found in $path." 
fi 
# ---------------------------------- 
echo "Number of files to transfer into ccfilesvr: $filecount" >> $logfile 
if [ $filecount -ge 1 ] 
    then 
    echo "Files ready to upload to T2. Entering ccfilesvr..." 
    ssh [email protected] . t2flexXfer.shl 
else 
    echo "No files to upload. Entering ccfilesvr to download charges." 
    ssh [email protected] . t2flexXfer.shl 
fi 
echo "Number of files to transfer into ccfilesvr: $filecount">> $logfile 

Ниже приведен результат выше. Я предоставляю только часть кода, которая дает мне основания для ухода на пенсию!Значение переменной счетчика равно нулю в сценарии bash

-rw-r--r-- 1 oracle dba 455132 Feb 21 14:14 CC_T2_PERSON.txt 
CC_T2_PERSON.txt secure copied to ccfilesvr 
-rw-r--r-- 1 oracle dba 107314 Feb 21 14:14 CC_T2_CAMPUSBOX.txt 
CC_T2_CAMPUSBOX.txt secure copied to ccfilesvr 
Number of files to transfer into ccfilesvr: **0** 
No files to upload. 

Почему счетчик всегда выступает как «0» для меня?

+1

Я попытался вычеркнуть «0» выше, и вышла звездочка. Пренебрежение **. Также игнорируйте | tee $ logfile ... Я хотел удалить это с целью удобочитаемости, но забыл. –

+2

Команда 'tee' (или, скорее, канал, используемый для подключения своего ввода к выходу оператора' if'), будет проблемой. Вы увеличиваете 'filecount' в подпроцессе. – chepner

+0

Добавьте отладочное эхо после увеличения размера файла. –

ответ

1

Комментарий от chepner - правильный диагноз.

Заменить это:

fi | tee >> $logfile 

С этим:

fi > >(tee >> $logfile) 

В чем разница?

При прокладке инструкции с помощью | «левая» часть трубы выполняется в подоболочке, а подоболочка не может (никоим образом) изменять переменную в родительской оболочке. Назначенное значение теряется при завершении работы субголовы, возвращая управление родительской оболочке (живущей в отдельной секции памяти вашего компьютера). То, что легко пропустить, заключается в том, что подоболочка наследует идентичную копию всех переменных из родительской оболочки, поэтому вы явно не видите, что запускается подоболочка.

Один из способов увидеть это в действии - вывести «$ BASHPID», который отражает текущее значение PID-номера (в отличие от «$$», которое отражает основную оболочку).

С помощью подстановки процесса (> >(tee >> $logfile)), то if утверждения выполняются в основной оболочке, и tee находится в субоболочке, поэтому часть, которая важна для вас (один с заданиями) является то, что остается в основном оболочка.

Я не знаю многих недостатков для замены процесса по сравнению со стандартными трубами. Они могут быть вложенными (что может стать менее читаемым, чем труба) для достижения нескольких этапов. Они существуют в разновидности «выход» (>()) и «входной» разновидности (<()). Подстановки процессов приводят к созданию FIFO (специальных файлов), а оболочка преобразует выражение в имя файла, которое может быть прочитано или записано (в зависимости от типа), поэтому они могут использоваться в основном везде, где будет принято имя файла.