写你的shell,其实很简单

  引语:我本人以前并没有写过shell脚本,也许是因为懒,也许是没有被逼到要去写shell的地步。但是,前段时间,工作需求,要求重新跑几个月的脚本,这些脚本是每天定时进行跑的,而且每天是好几个脚本一起关联跑的。你也许会说,这太简单了,写个循环,然后,让他自己去跑就行了。是的,你可以很顺手的用的编程语言去写循环,如PHP,但是,你知道,这样做其实是改变了代码结构了,鬼知道会导致什么结果呢? 并且,我并不保证里面所有代码的意思,我都懂!那么,问题来了,在不改变原代码的前提下,怎样去循环这几个月的时间呢? 没错,那就是,模拟真实运行时的情况,传入需要接收的日期参数(前提是你的代码里面已经有了这个门)!你知道,这种定时脚本都有一个优雅的名字,crontab,那么,就是shell了,你要做的就是写shell了。

  没有写过shell? 没关系了,其实需求确定之后,你显然已经知道,这太简单了。不就是语法问题吗? 你别告诉我你不会谷歌,不会百度!

  我就先抛几个需要考虑的点,后面直接给代码吧!

    1、怎样获取当前时间,并转换成你需要的格式? 关键词: date

    2、怎样防止同时多次运行同一个内容? 关键词: lock

    3、怎样让程序运行完一次之后,冷却执行? 关键诩: sleep

    4、怎样指定运行时间段,counter或者起始日期? 关键词: while, let, expr

    5、附加:怎样知道当前的运行状态如何了? 关键词: echo ,  progress

  把这些问题考虑好了,你就一步步去写吧,不知道语法的,直接谷歌、百度,代码参考如下:

#/bin/bash
# @author: youge
# @date: 2015-12-22

startDate="2015-11-24"        # when to start
startDateTimestamp=`date -d "$startDate" +%s`
endDate="2015-12-14"          # when to end
endDateTimestamp=`date -d "$endDate" +%s`
sleepTime=25              # to take a break
haveSthUndo=0            # check if there is something undo , if not , exit the program

rootDir=‘/cygdrive/d/wamp/ppi/‘
dir=$rootDir"cron/"

itemArr=("itemA" "itemB" "itemC")    # the items you want to run there
for item in ${itemArr[@]}
do
    runFile=$rootDir$item".run";
    if [ ! -f "$runFile" ] ;  then
    haveSthUndo=1;
    echo $item" runs on me" $runFile " touched";
    echo -e "script startTime: "`date "+%Y-%m-%d %H:%M:%S"` "\nbeginDate:" $startDate "\nendDate:" $endDate "\npath:" $dir >> $runFile
    touch "$runFile";
    break;
    else
    echo $item "is runing, skipped. " $runFile;
    fi
done;
if [ $haveSthUndo -ne 1 ]; then
    echo -e "Nothing to do now ...\ncheck it...";
    exit;
fi
echo "haveSthUndo eq: " $haveSthUndo;

while [[ $endDateTimestamp -ge $startDateTimestamp ]]
do
    runDate=`date -d @$startDateTimestamp +%Y-%m-%d`;        #1987-01-06
    params="item=$item&d=$runDate";
    msg="[`date "+%Y-%m-%d %H:%M:%S"`] now we run the date: "${runDate}" [params]: "${params};
    echo $msg;                    # to show me ...
    echo $msg >> $runFile;

    # run the scripts below
    cd $dir &&
        /bin/php ./script1.php $params &&
        /bin/php ./script2.php $params &&
        /bin/php ./scriptx.php $params
    # run the scripts upon

    startDateTimestamp=`expr $startDateTimestamp + 86400`;        # run the next day ...

    echo "  ___sleeping for $sleepTime seconds ... ";
    x=‘‘;
    for ((itime=0; itime<$sleepTime; itime++)); do
        let itime2=$itime+1;
        progress=`expr $itime2 \* 100 / $sleepTime`;
        printf "cooling:[%-"$sleepTime"s]%d%%\r" $x $progress
        x=#$x
        sleep 1;                            # sleep xx seconds to run the next time, show the progress
    done;
    echo;
done;
echo "[`date "+%Y-%m-%d %H:%M:%S"`] the end." >> $runFile;

#end of the file

  附录:

  根据本人初涉shell,遇到的问题例举如下,希望可以减少大家走弯路的时间:

  1、整个shell脚本,其实就相当于你在终端输入的一系列命令,如果想在shell里做什么,就先想想在终端可以做什么吧,字符的的连接,就是直接用 "" 双引号,输出,变量定义无 $ 符号,但是使用时一定要加上 $ 符号。

  2、"="  赋值符号,两边一定不能有空格,这和其他语言有区别,尤其是你还有自己代码美观风格时特别注意,否则会报语法错误!

  3、for 中的数组内容是以 " " 空格分隔,而非 "," 逗号分格

  4、条件判断 [ true ] 中括号 后面需要有一个空格,但是两个中括号之间不能有空格如 [[ true ]]

  5、while 条件判断可以用 () 括号,也可以用 [[ ]] 中括号

  6、如果用windows写shell,一定要注意换行符格式 \n 而非 \r\n , 需要借助一些编辑器(如notepad++)更改换行符格式!

  终了: 其实,语言只是一种工具,永远不会太难(太难也不会有人用啊),真正能让工具工作起来的,是你的思想!

  其实很简单,Just do it .

  [ root @my-pc ]$ sh urScripts.sh    #see you next time
时间: 2024-10-22 03:12:29

写你的shell,其实很简单的相关文章

我的代码,写的pagebase。还是留着吧,是这套cms的核心了。语义化,与我的云平台一样,只不过云平台是用js写的。这个是webform.下回写mvc吧。核心很简单。

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using JGDJWeb.Helper; using JGDJWeb.Model; namespace JGDJWeb

Python写的网络爬虫程序(很简单)

Python写的网络爬虫程序(很简单) 这是我的一位同学传给我的一个小的网页爬虫程序,觉得挺有意思的,和大家分享一下.不过有一点需要注意,要用python2.3,如果用python3.4会有些问题出现. python程序如下: import re,urllib strTxt="" x=1 ff=open("wangzhi.txt","r") for line in ff.readlines(): f=open(str(x)+".txt&

读书笔记:《写给大家看的面向对象设计》,《程序员的职业素养》,《设计模式其实很简单》

按照上次的计划 看了三本书,笔记现在才贴出来. <写给大家看的面向对象设计>: 使用接口开发的作用 规范函数命名,特别在项目人数比较多,在设计时,定了接口命名与参数. 可以把前台与后台的脱离.定义接口后,实现接口并返回模拟的数据,例如DataTable等,前台不需等后台就可以做UI与交互,改善UI与需要的数据,发现问题并不断完善接口.后台按照需求把数据库设计好了(如果是领域驱动开发,是Model创建),按照这个接口来开发功能,完成之后前台切换过来即可.前后台是并行开发. 便于单元测试的编写,其

其实Unix很简单

很多编程的朋友都在网上问我这样的几个问题,Unix怎么学?Unix怎么这么难?如何才能学好?并且让我给他们一些学好Unix的经验.在绝大多数时候,我发现问这些问题的朋友都有两个特点: 1)对Unix有畏难心理,对其没有信心: 2)喜欢用拿Windows来和Unix做比较.http://hovertree.com/menu/unix/ 这两种特点就像两个“心理暗示”,暗示着自己Unix很不好学,暗示着Unix很糟糕,不如Windows好.于是,自己也就被自己的这种长期的“暗示”所催眠了.因为,从一

【结果很简单,过程很艰辛】记阿里云Ons消息队列服务填坑过程

Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的时候,会开放思路.当然不得不说,Ons的.NET接口还很不完善,甚至没有独立在Windos 2008/2012服务器测试过,希望官方加把力. 1.阿里云ONS介绍 ONS(Open Notification Service)即开放消息服务,是基于阿里开源消息中间件MetaQ(RocketMQ)打造的

魔咒词典------HDOJ杭电1880(字符串的处理,很简单)

Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词典.当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能:当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒.如果他要的魔咒不在词典中,就输出"what?" Input 首先列出词典中不超过100000条不同的魔咒词条,每条格式

手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单

手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 Chrome的更新速度可以说前无古人,现在我每天开机的第一件事就是打开Chrome检查是不是有了新版本.界面清爽.操作人性化.网络备份资料和快速的启动速度令我爱不释手,还有它拥有众多的扩展程序,相对于firefox的插件来说,

管道函数(%&gt;%)很简单

%>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存 %>%,该符号将左边的对象作为第一个参数传递到右边的函数中 直接上栗子??:library(data.table) library(tidyr) # 先虚构一数据框 set.seed(1) date <- as.Date('2016-11-01') + 0:14 hour <- sample(1:24, 15) min <- sampl

Java断点续传实现原理很简单

原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网络上也能找到不少关于实现类似功能的资料.但是呢,大多数都是举个Demo然后贴出源码,真正对其实现原理有详细的说明很少. 于是我们在最初接触的时候,很可能就是直接Crtl + C/V代码,然后捣鼓捣鼓,然而最终也能把效果弄出来.但初学时这样做其实很显然是有好有坏的. 好处在于,源码很多,解释很少:如果我们肯下功