我正在编写一个小脚本,用于启动在后台创建的脚本。此脚本在循环中运行,并且必须在指定目录中找到它时启动创建的文件。
当目录中只有一个文件时,它会起作用,创建的脚本在完成后会自行删除。但是当同时创建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
答案 0 :(得分:2)
-f
运算符仅适用于单个文件,而不是通过展开不带引号的$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
答案 1 :(得分:0)
类似问题的一个潜在来源是与通配符匹配的文件不存在。在那种情况下,它只处理*
包含这个词。
$ touch exist{1,2} alsoexist1
$ for file in exist* alsoexist* notexist* neitherexist*
> do echo $file
> done
exist1
exist2
alsoexist1
notexist*
neithereixt*