shell脚本中的“一元运算符预期”

时间:2013-07-17 18:29:49

标签: bash shell unix scripting while-loop

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

答案 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命令