某天逛csdn时遇到个同学求助做一个脚本,脚本中需要循环执行三条命令。很快啊,我就给出了一个shell脚本方案。
#! /bin/sh
a=0
while [ $a -lt 1 ]
do
build/bladebit -n 1 -f x -c x /path1
build/bladebit -n 1 -f x -c x /path2
build/bladebit -n 1 -f x -c x /path3
sleep 1
done
问题就来了,这个神秘的需求是一个疯狂写硬盘程序,硬盘很快就满了。而脚本中根本就没有停下来的意思,这显然就不合理了。
于是在每个命令执行结束之后,判断其结果,当执行失败时停止脚本。
#! /bin/sh
a=0
while [ $a -lt 1 ]
do
build/bladebit -n 1 -f x -c x /path1
if [ $? -ne 0 ];then
echo "bladebit path1 failed, exit"
break
fi
build/bladebit -n 1 -f x -c x /path2
if [ $? -ne 0 ];then
echo "bladebit path2 failed, exit"
break
fi
build/bladebit -n 1 -f x -c x /path3
if [ $? -ne 0 ];then
echo "bladebit path3 failed, exit"
break
fi
sleep 1
done
这样还是不能很好的满足要求,只要一个盘满了脚本就停了。所以,继续优化需求。需求就用一个性能好的硬盘来生成文件,但为了防止盘满了,要及时把文件移走。
为了不影响生成文件的执行,拆分成两个独立的脚本。一个脚本负责生成文件,如果生成失败了,停止脚本;另外一个脚本则负责移走已生成文件,提供了多个目标硬盘,循环均匀移动到硬盘中。
这个用脚本也很好解决:循环扫描目录中是否生成新文件(使用ls
命令结果),然后将目标移动到目标地址(多个硬盘组成多个目标地址数组)
#! /bin/bash
ckpath=待移动文件所在目录
ckfile=文件关键字(用于查找文件)
dstPath=(目标地址1 目标地址2 目标地址3 ....)
dstPos=0
mvFileTo() {
if [ ! -d $ckpath ];then
echo "${ckpath} not exist"
return 1
fi
cd $ckpath
files=$(ls $ckpath)
for file in ${
files[@]}
do
if [[ $file != ${
ckfile}* ]]; then
echo "${file} skip"
continue
fi
# 过滤临时文件
if [[ $file == ${
ckfile}*\.tmp ]]; then
echo "${file} skip"
continue
fi
source=${
ckpath}/