2016-06-28 3 views
0

Я создал этот скрипт для проверки наличия или отсутствия определенных файлов в данном месте. но когда я запускаю это его всегда показываетМониторинг файлов Bash-скрипт

Failed - Flag_lms_device_info_20160628.txt не существует
Failed - Flag_lms_weekly_usage_info_20160628 не существует

но оба файла существующих.

PREFIX="/opt/data" 
REPORT="/tmp/report.txt" 
DATE=$(date -d "${dtd} -1 days" +'%Y%m%d') 

    rm -f "$REPORT" 

       FILENAME="Flag_lms_device_info_${DATE}.txt" 
       FULLFN="$PREFIX/$FILENAME" 
       if [ -f "$FULLFN" ]; then 
         echo "OK - $FILENAME exists" >> $REPORT 
       else 
         echo "Failed - $FILENAME do not exist" >> $REPORT 
       fi 

       FILENAME="Flag_lms_weekly_usage_info_${DATE}.txt" 
       FULLFN="$PREFIX/$FILENAME" 
       if [ -f "$FULLFN" ]; then 
         echo "OK - $FILENAME exists" >> $REPORT 
       else 
         echo "Failed - $FILENAME do not exist" >> $REPORT 
       fi 
+0

Как и в стороне, все прописные имена переменных в пространстве имен, определенных POSIX для использование переменными со значением для оболочки или операционной системы - имена переменных, предоставленные пользователем, должны содержать по крайней мере один символ нижнего регистра, чтобы избежать конфликтов. См. Http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html, 4-й абзац, имея в виду, что переменные окружения и переменные оболочки совместно используют пространство имен (это означает, что даже если вы явно не командуете оболочке 'export' it, устанавливая переменную оболочки с именем, которое перекрывает переменную среды, перезапишет последнее). –

ответ

1

Прежде всего, у вас есть странный вывод в вашем вопросе: на вашей второй линии вывода отсутствует расширение .txt. Это может быть несчастный случай, но если это не стоит расследовать.

Предполагая, что ваша команда даты работает правильно (я не знаю этой конкретной команды), я бы уменьшил использование переменных. Кроме того, я бы использовал оператор -e test вместо -f, потому что он более инклюзивный. (Если вы не помещать данные в файлах еще, -f может вернуть ошибку, даже если файл существует.):

REPORT="/tmp/report.txt" 
DATE=$(date -d "${dtd} -1 days" +'%Y%m%d') 

echo "" > "$REPORT" # Wipes file instead of completely removing it 

      filename="/opt/data/Flag_lms_device_info_$DATE.txt"     
      if [ -e "$filename" ]; then 

        echo "OK - Flag_lms_device_info_$DATE.txt exists" >> $REPORT 
      else 
        echo "Failed - Flag_lms_device_info_$DATE.txt doesn't exist" >> $REPORT 
      fi 


      filename="/opt/data/Flag_lms_weekly_usage_info_$DATE.txt" 
      if [ -e "$filename" ]; then 

        echo "OK - Flag_lms_weekly_usage_info_$DATE.txt exists" >> $REPORT 
      else 
        echo "Failed - Flag_lms_weekly_usage_info_$DATE.txt doesn't exist" >> $REPORT 
      fi 
+0

спасибо Thome ...... Я пробовал с вашим кодом ... но все же такой же вопрос – lfreez

1
if [ -f "find "$FULLFN" -type f -name "$FILENAME"" ];then 

Здесь вы проверяете для существования странного файла с именем find ... Используйте обратные кавычки

if [ -f `find "$FULLFN" -type f -name "$FILENAME"` ];then 

или, в bash,

if [ -f $(find "$FULLFN" -type f -name "$FILENAME") ];then 

, чтобы получить вывод команды как строка.

Кроме того, ваш призыв find не выглядит многообещающим. Если вам нужно найти файл с именем Flag_lms_device and so forth где-то под /opt/data/, используйте find "$PREFIX" -type f -name "$FILENAME". Если вы точно знаете, что /opt/data является точное местоположение, а затем использовать

if [ -f "$FULLFN" ] 

и вам не нужно find файл.

+0

Удалось ли редактировать вопрос, чтобы удалить код, на который ссылается этот ответ? BTW, '$ (...)' is * not * a bashism; он указан в стандарте POSIX sh, опубликованном в 1992 году; таким образом, backticks нужны только с раковинами, производными от Bourne 1970-х годов. AFAIK, единственный поставщик, достаточно отсталый, чтобы включить оболочку pre-POSIX в операционную систему, опубликованную за последние несколько десятилетий, - это Sun, и даже они окончательно очистили свой счет по этому счету. –

+0

Да, исходный вопрос включал команды 'find' в двойных кавычках в качестве условий. Благодарим вас за примечание об обратных выводах, возможно, в прошлый раз, когда я прочитал этот раздел руководства bash, это была какая-то старинная версия, как у древней Solaris. > _ < – bipll

+0

* nod *, это звучит правильно - Солнце, возможно, было самым длинным удержанием, установив оригинальную оболочку Bourne как '/ bin/sh' и помещая экземпляр POSIX sh в'/usr/xpg4/bin' или somesuch , Весело весело. –

Смежные вопросы