1

我需要一个脚本来保持轮询“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
4

4 回答 4

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
于 2013-07-17T18:47:47.823 回答
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
于 2013-07-17T18:51:57.213 回答
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 是对的;我原来的 find 示例会遇到同样的问题,所以这个:

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
于 2013-07-17T18:39:51.207 回答
0

另一个选项是用来inotifywait监视目录的状态。例如,此脚本将运行循环,直到文件“stopfile”被触摸。

until inotifywait "receive_dir" | grep "stopfile"
do 
    echo "running" 
done
echo "done"

优点是这些不是繁忙的循环,并且您不必重复调用(可能很昂贵)find 命令

于 2013-07-17T19:05:25.543 回答