3

我正在编写一个小脚本,用于启动在后台创建的脚本。该脚本循环运行,必须在指定目录中找到创建的文件时启动该文件。

当目录中只有一个文件时它可以工作,创建的脚本在完成时会自行删除。但是,当同时创建 2 个或更多脚本时,它无法运行脚本。

我收到一个错误:预期二元运算符

#!/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

我创建了一个解决方法,它可以正常工作:

#!/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
4

2 回答 2

4

-f运算符仅适用于单个文件,而不适用于通过扩展 unquoted 产生的列表$files。如果您确实需要在单个变量中捕获文件的完整列表,请使用数组,而不是字符串。如果 glob 无法匹配任何文件,该nullglob选项可确保files真正为空,从而无需进行-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
于 2013-11-07T18:02:10.170 回答
4

类似问题的一个潜在来源是匹配通配符的文件不存在。在这种情况下,它只处理单词 containsint the*本身。

$ touch exist{1,2} alsoexist1
$ for file in exist* alsoexist* notexist* neitherexist*
> do echo $file
> done
exist1
exist2
alsoexist1
notexist*
neithereixt*
于 2019-07-31T12:35:25.623 回答