我正在编写shell脚本。我需要检查具有2个特定文件扩展名“eob”和“inp”的文件存在的特定目录,如果存在,我想保持循环并继续检查,直到文件不存在,然后我想从我的循环中断并继续其余的逻辑。
以下是我到目前为止的代码,但它无效...
while true
do
[ ! find /home/mpcmi/cm -type f \( -name "*.eob" -o -name "*.inp" \) ] && break
echo "eob or inp file exists"
sleep 2
done
echo "eob or inp file doesn't exists"
首先,我在运行脚本时收到此错误:
"/home/mpcmi/cm: unknown test operator"
其次,它正确地检查并找到具有这些扩展名的文件,因为我得到输出:“eob或inp文件存在”但是当我删除我的测试“eob”和“inp”文件时脚本没有似乎检测到它,它停止打印“eob或inp文件存在”但它永远不会打印“eob或inp文件不存在”
以下是整个输出,然后在我删除测试“eob”和“inp”文件后停止:
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
有人可以帮忙吗?
谢谢!
答案 0 :(得分:1)
您没有指定使用哪个shell。我认为这是bash。
以下是修改过的脚本:
while true
do
[[ ! `find /home/smb -type f \( -name "*.eob" -o -name "*.inp" \)` ]] && break
echo "eob or inp file exists"
sleep 2
done
echo "eob or inp file doesn't exists"
答案 1 :(得分:1)
假设bash
并且文件不在子目录
shopt -s nullglob
while true; do
unset f
f=( /home/mpcmi/cm/*.{eob,inp} )
if (( ${#f[@]} > 0 )); then
echo "${#f[@]} eob or inp files present"
sleep 2
else
break
fi
done
echo "no eob or inp files"
答案 2 :(得分:0)
如果存在.inp或.eob的文件,则此打印存在,否则不存在。
if ls *.inp || ls *.eob
then
echo "exists"
else
echo "does not exist"
fi
答案 3 :(得分:0)
仅在bash中,不在循环中创建子流程:
check_dir=/home/mpcmi/cm
my_tmp_dir=$(mktemp -d --tmpdir=/tmp) # Create a unique tmp dir for the fifo.
mkfifo $my_tmp_dir/fifo # Empty fifo for sleep by read.
found=1
while [[ $found == 1 ]]; do
found=0
for f in $check_dir/*.inp $check_dir/*.eob; do
[[ -e $f ]] && found=1 && break
done
read -t 1 <> $my_tmp_dir/fifo # Same as sleep 1, but without sub-process.
done
rm $my_tmp_dir/fifo; rmdir $my_tmp_dir # Cleanup, could be done in a trap.
通过避免循环sleep
,我不创建任何子进程,因此我正在保存系统资源。要实现这一点,我必须在bash中实现自己的sleep
,而我只发现read
在fifo上超时。
您可以使用trap
进行清理来改进此脚本。
答案 4 :(得分:0)
简化你的逻辑:
while find /home/mpcmi/cm -type f \( -name "*.eob" -o -name "*.inp" \) |
grep -q . ; do
echo "eob or inp file exists"
sleep 2
done
echo "No extant eob or inp files"