2013-11-07 4 views
2

Я пишу небольшой скрипт для запуска скриптов, созданных в фоновом режиме. Этот скрипт работает в цикле и должен запустить созданный файл, когда он найден в указанном каталоге.File loop with wildcard

Он работает, когда в каталоге находится только один файл, созданный скрипт удаляет себя, когда он завершен. Но когда два или более скриптов создаются одновременно, он не запускает скрипты.

Я получаю сообщение об ошибке: ожидается бинарный оператор

#!/bin/bash 
files="/var/svn/upload/*.sh" 
x=1 
while : 
do 
echo Sleeping $x.. 
    if [ -f $files ] 
    then 
    for file in $files 
    do 
     echo "Processing $file file..." 
     sh $file 
     echo $(date +%d-%m-%y) $(date +%H:%M:%S) - Sleep $x - Script $f >>/var/log/upload.log 
     x=0 
     wait 
    done 
    fi 
    x=$(($x + 1)) 
    sleep 1 
done 

Я создал работу вокруг Wich работает без каких-либо проблем:

#!/bin/bash 
files="/var/upload/*.sh" 
x=1 
while : 
do 
    count=$(ls $files 2> /dev/null | wc -l) 
    echo Sleeping $x.. 
    if [ "$count" != "0" ] 
    then 
    for file in $files 
    do 
     echo "Processing $file file..." 
     sh $file 
     echo $(date +%d-%m-%y) $(date +%H:%M:%S) - Sleep $x - Script $f >>/var/log/upload.log 
     x=0 
     wait 
    done 
    fi 
    x=$(($x + 1)) 
    sleep 1 
done 
+0

Добро пожаловать в SO! Если ошибка относится к определенной строке вашего кода, можете ли вы отредактировать сообщение, чтобы указать, какой из них? – Derek

+0

Ошибка в строке: if [-f $ files] – user2965857

ответ

1

Оператор -f применяется только один файл, а не который получается путем расширения вашего неупорядоченного $files. Если вам действительно нужно собрать полный список файлов в одной переменной, используйте массив, а не строку. Опция nullglob гарантирует, что files действительно пуст, если glob не соответствует никаким файлам, что устраняет необходимость в тесте -f. Также нет необходимости звонить wait, так как вы не начинаете никаких фоновых заданий.

#!/bin/bash 
shopt -s nullglob 
x=1 
while : 
do 
    echo Sleeping $x.. 
    for file in /var/svn/upload/*.sh 
    do 
    echo "Processing $file file..." 
    sh "$file" 
    echo $(date +%d-%m-%y) $(date +%H:%M:%S) - Sleep $x - Script "$f" >>/var/log/upload.log 
    x=0 
    done 
    x=$(($x + 1)) 
    sleep 1 
done 
+0

Привет, спасибо, это работает. Но мне пришлось перемещать файлы = (/ var/svn/upload/*. Sh) в строку выше эха. Спящая $ x .. для корректной работы. – user2965857

+0

Right; Я пропустил изменение, когда нагло было применено. Учитывая изменение, которое вы предлагаете, мы можем покончить с массивом и просто поместить glob в цикл for. – chepner