淡淡的回忆
管理员
管理员
  • UID2
  • 注册日期2015-05-16
  • 最后登录2017-01-17
  • 粉丝23074
  • 关注0
  • 发帖数1741
  • 云币2101274枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
  • 粽子参与
阅读:4308回复:60

写你的shell,其实很简单

贴主#
更多 发布于:2016-01-03 21:24
引语:我本人以前并没有写过很多的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
参与人数:2 人, 云絮 +7  云币 +7 
  • 云币 +7
    6666
    2016-10-15 16:10
  • 云絮 +7
    6666
    2016-10-15 16:10
喜欢29 评分2
八云论坛,你我之家!
八云官方地址:http://bybbs.org

我是淡淡的回忆,我为自己代言!
倾尽一世的温柔,只留那一缕忧愁。
站长强力推荐
1458578
闻弦雅士
闻弦雅士
  • UID31729
  • 注册日期2015-09-10
  • 最后登录2017-01-18
  • 粉丝5
  • 关注12
  • 发帖数958
  • 云币1562枚
  • 社区居民
  • 忠实会员
沙发#
发布于:2016-01-03 21:24
这是哪来干嘛的
回复(0) 喜欢(0)     评分
有妹似穹
论坛版主
论坛版主
  • UID6491
  • 注册日期2015-06-17
  • 最后登录2017-01-15
  • 粉丝763
  • 关注113
  • 发帖数12455
  • 云币4575枚
  • 追星一族
  • 社区明星
  • 喜欢达人
  • 忠实会员
  • 最爱沙发
  • 原创写手
  • 社区居民
板凳#
发布于:2016-01-03 21:26
前排支持。虽然不懂
http://pan.baidu.com/share/home?uk=1949155689#category/type=0
回复(0) 喜欢(0)     评分
风吹dd凉
苦心孤诣
苦心孤诣
  • UID39799
  • 注册日期2015-10-02
  • 最后登录2017-01-19
  • 粉丝99
  • 关注63
  • 发帖数6725
  • 云币1167枚
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
地板#
发布于:2016-01-03 21:29
just do it这会难道我吗
回复(0) 喜欢(0)     评分
1310292929
小有寂寞
小有寂寞
  • UID68129
  • 注册日期2015-12-02
  • 最后登录2017-01-17
  • 粉丝14
  • 关注11
  • 发帖数1729
  • 云币2562枚
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
4楼#
发布于:2016-01-03 21:30
不懂帮顶666
感谢你们这么帅还给我评分云币,我说的你应该懂(/ω\)

http://filemain.bybbs.org/attachment/1601/thread/32_68129_4ed3d023eb62b28.gif
回复(0) 喜欢(0)     评分
缘定今生
云者
云者
  • UID55362
  • 注册日期2015-11-06
  • 最后登录2016-12-07
  • 粉丝112
  • 关注120
  • 发帖数9996
  • 云币14111枚
  • 社区居民
  • 社区明星
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
  • 追星一族
  • 粽子参与
5楼#
发布于:2016-01-03 21:30
不懂帮顶,啦啦啦
人生如棋,我便做那颗卒,虽然行动缓慢,可你何曾见我后退~
回复(0) 喜欢(0)     评分
大白糖大过天
闻弦雅士
闻弦雅士
  • UID66882
  • 注册日期2015-11-30
  • 最后登录2017-01-17
  • 粉丝79
  • 关注32
  • 发帖数2919
  • 云币7328枚
  • 社区居民
  • 忠实会员
  • 喜欢达人
  • 原创写手
6楼#
发布于:2016-01-03 21:34
下学期学C++
梦想家
回复(0) 喜欢(0)     评分
琅铘仙
一代宗师
一代宗师
  • UID59529
  • 注册日期2015-11-14
  • 最后登录2017-01-18
  • 粉丝4
  • 关注15
  • 发帖数1458
  • 云币2747枚
  • 社区居民
  • 忠实会员
7楼#
发布于:2016-01-03 21:34
不懂帮顶
回复(0) 喜欢(0)     评分
柒眀沨
惊鸿侠影
惊鸿侠影
  • UID4218
  • 注册日期2015-06-11
  • 最后登录2017-01-18
  • 粉丝0
  • 关注1
  • 发帖数819
  • 云币2513枚
  • 社区居民
  • 忠实会员
八云#
发布于:2016-01-03 21:35

不明觉厉。。
回复(0) 喜欢(0)     评分
桜华月想
云者
云者
  • UID14288
  • 注册日期2015-07-23
  • 最后登录2017-01-19
  • 粉丝188
  • 关注62
  • 发帖数7341
  • 云币4764枚
  • 社区居民
  • 社区明星
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
  • 追星一族
9楼#
发布于:2016-01-03 21:36
又学到新知识了
回复(0) 喜欢(0)     评分
NOeSIS羽化
云者
云者
  • UID72973
  • 注册日期2015-12-11
  • 最后登录2017-01-18
  • 粉丝36
  • 关注23
  • 发帖数4737
  • 云币2443枚
  • 社区居民
  • 忠实会员
10楼#
发布于:2016-01-03 21:40
硬是一点都看不懂
回复(0) 喜欢(0)     评分
复世姬凌
禁止发言
禁止发言
  • UID28562
  • 注册日期2015-09-02
  • 最后登录2016-12-22
  • 粉丝63
  • 关注62
  • 发帖数10868
  • 云币30572枚
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 粽子参与
11楼#
发布于:2016-01-03 21:42
用户被禁言,该主题自动屏蔽!
回复(0) 喜欢(0)     评分
LST512
一代宗师
一代宗师
  • UID7856
  • 注册日期2015-06-23
  • 最后登录2017-01-18
  • 粉丝15
  • 关注28
  • 发帖数1615
  • 云币1840枚
  • 社区居民
  • 忠实会员
12楼#
发布于:2016-01-03 22:13
淡淡好厉害
回复(0) 喜欢(0)     评分
用户名不存在
技术组
技术组
  • UID41395
  • 注册日期2015-10-07
  • 最后登录2017-01-03
  • 粉丝60
  • 关注21
  • 发帖数1796
  • 云币3400枚
  • 忠实会员
  • 社区居民
13楼#
发布于:2016-01-03 22:17
愣是没看懂→_→
回复(0) 喜欢(0)     评分
jaud
小有寂寞
小有寂寞
  • UID10036
  • 注册日期2015-07-03
  • 最后登录2016-02-13
  • 粉丝4
  • 关注3
  • 发帖数960
  • 云币102枚
14楼#
发布于:2016-01-03 22:30
安卓的crontab我成功过,,我有脚本
http://p16.qhimg.com/bdr/1366_768_85/d/_open360/gunaing110/mv43.jpg
++==唯有热情的回复才有优质的分享==++
回复(1) 喜欢(0)     评分
上一页
游客

返回顶部