2015-03-19 4 views
1

Мне нужно написать сценарий оболочки, который будет отслеживать некоторые папки, указанные в команде, и давать сообщение, если в них будет создан определенный файл (имя файла будет считаться с клавиатуры).Проверьте, был ли файл создан оболочкой

Может ли кто-нибудь сказать мне, почему это не работает?

#!/bin/sh 
f=`read filename` 
isIn=0 
for dir in $* 
do 
    if [ ! -d $dir ] 
    then 
     echo $dir is not a directory. 
    fi 
    for i in `find $dir -type f` 
    do 
     if [ $f=$i ] 
     then 
      echo The file $f already exists. 
      isIn=1 
      break 
     fi 
    done 
    if [ $isIn -eq 0 ] 
    then 
     sleep 20 
     isIn=0 
     for i in `find $dir -type f` 
     do 
      if [ $f=$i ] 
      then 
       echo The file was created\! 
       isIn=1 
       break 
      fi 
     done 
    fi 
    if [ $isIn -eq 0 ] 
    then 
     echo The file was not created\! 
    fi 
done 

Идея, которую я использовал, заключалась в том, что я беру все файлы из каталога и проверяю, что файл еще не существует. Если это - показать сообщение и перейти к следующему каталогу. Если нет, то я жду. если за время, которое я ожидал, что определенный файл был создан, он появился бы в списке всех файлов, и я проверю его.

Моя проблема заключается в том, что независимо от того, какой файл я прочитал с клавиатуры, я бы получил сообщение «Файл уже существует». не сообщая мне имя файла.

+1

Что вы ожидаете 'F =« читать filename'' делать? (Это неверно отформатировано, я заменил обратные ссылки на апострофы. См. Вторую строку вашего скрипта.) Функция 'read' не печатает ничего для stdout; скорее он хранит ввод в '$ filename'. '$ f' будет пустой строкой. –

+0

следует читать с клавиатуры. Мне нужно поставить его между «работать», и мне нужно дать ему параметр –

+0

Нет, вам не нужно использовать обратные ссылки. Просто напишите 'read filename'; он будет устанавливать переменную '$ filename' независимо от типа пользователя. Используйте '$ filename', а не' $ f'. –

ответ

0
  1. Заменить f=`read filename` с правильным использованием read f или read -p filename: f.
  2. find $dir -type f печатает полное имя файла, включая путь к каталогу. Так как вы хотите только базовое имя, замените обе линии

    for i in `find $dir -type f` 
    

    с

    for i in `find $dir -type f -printf '%f\n'` 
    
  3. Каждый оператор и операнд в [] должен быть отдельным аргументом. Таким образом, замените обе линии

     if [ $f=$i ] 
    

    с

     if [ "$f" = $i ] 
    
Смежные вопросы