我需要一个脚本来保持轮询“receive_dir”目录,直到“stopfile”写入目录。
这必须在空目录下运行。
到目前为止,我有这个但是如果receive_dir为空,没有“预期一元运算符”的文件,则会失败。帮助!!
#!/usr/bin/ksh
until [ $i = stopfile ]
do
for i in `ls receive_dir`; do
time=$(date +%m-%d-%Y-%H:%M:%S)
echo $time
echo $i;
done
done
答案 0 :(得分:6)
这将按照您的要求执行(循环直到停止文件存在)。我添加了“睡眠1”以降低资源使用率。使用“#!/ usr / bin / env ksh”作为shebang也是一种好习惯。
#!/usr/bin/env ksh
until [ -e receive_dir/stopfile ]
do
time=$(date +%m-%d-%Y-%H:%M:%S)
echo $time
sleep 1
done
答案 1 :(得分:2)
如果你有空目录,那么
until [ $i = stopfile ]
评估为
until [ = stopfile ]
什么是课程语法错误。
一条评论:永远不解析ls
的输出。
#!/bin/bash
do_something() {
echo $(date +%m-%d-%Y-%H:%M:%S) "$1"
}
dir="."
until [[ -f "$dir/stopfile" ]]
do
find "$dir" -print0 | while IFS= read -r -d '' filename
do
do_something "$filename"
done
done
或(慢得多)
do_something() {
echo $(date +%m-%d-%Y-%H:%M:%S) "$1"
}
export -f do_something
dir="."
until [[ -f "$dir/stopfile" ]]
do
find "$dir" -exec bash -c 'do_something "{}"' \;
done
答案 2 :(得分:1)
您没有评估任何内容,而'测试'无法对其进行评估。
~> [ $empty_var = stopfile ]
-bash: [: =: unary operator expected
首先,不要解析ls:
http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29
编辑:部分问题是你的循环实际上正在进行测试,尝试这样的事情(假设receive_dir是相对的):
@ user000001是对的;我的原始查找示例会遇到同样的问题,所以这个:
for i in receive_dir/*
do
time=$(date +%m-%d-%Y-%H:%M:%S)
echo $time
echo $i
[ $i = stopfile ] && break
done
编辑:根据您的评论添加另一个示例:
这个怎么样......
FOUND="N"
while [ "${FOUND}" = "N" ]
do
for i in receive_dir/*
do
time=$(date +%m-%d-%Y-%H:%M:%S)
echo $time
echo $i
[ "$i" = stopfile ] && FOUND="Y"
done
sleep 60
done
答案 3 :(得分:0)
另一种选择是使用inotifywait
来监控目录的状态。例如,此脚本将运行循环,直到触摸文件“stopfile”。
until inotifywait "receive_dir" | grep "stopfile"
do
echo "running"
done
echo "done"
优点是这些没有繁忙的循环,并且您不必重复调用(可能很昂贵的)find命令