M22 程序员偷懒战法

前段时间有个外国的程序猿走红网络,这个哥们可以说是懒到了极点,上班请假给领导发短信写脚本,下班晚回家给老婆发短信写脚本,甚至于接个咖啡也要写脚本。这个哥们离职之后,他的同事在他的办公电脑上发现了这些脚本,并公布到了网上,引起众程序猿纷纷膜拜。最近我刚好学到shell脚本部分,就让我分析其中的一个跟领导请假的脚本吧。

#!/bin/sh -e

# Exit early if any session with my username is found
if who | grep -wq $USER; then
  exit
fi

# Phone numbers
MY_NUMBER='+xxx'
NUMBER_OF_BOSS='+xxx'

EXCUSES=(
  'Locked out'
  'Pipes broke'
  'Food poisoning'
  'Not feeling well'
)
rand=$[ $RANDOM % ${#EXCUSES[@]} ]

RANDOM_EXCUSE=${EXCUSES[$rand]}
MESSAGE="Gonna work from home. "$RANDOM_EXCUSE

# Send a text message
RESPONSE=`curl -fSs -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
  -d "From=$MY_NUMBER" -d "To=$NUMBER_OF_BOSS" -d "Body=$MESSAGE" \
  "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages"`

# Log errors
if [ $? -gt 0 ]; then
  echo "Failed to send SMS: $RESPONSE"
  exit 1
fi

一 shebang声明

#!/bin/sh -e

脚本的shebang声明是在脚本直接执行,而不使用sh或者bash间接执行的时候,告诉解释程序此脚本的类型,如果脚本中没有此声明,那么脚本在执行的时候会使用默认的shell程序执行它。在此例中,脚本使用了/bin/sh作为解释程序。
在ubuntu系列linux里,为了加快系统启动速度,/bin/sh被设置成了指向dash的链接,而非bash

#ll /bin/sh
lrwxrwxrwx 1 root root 4 2月  16 10:23 /bin/sh -> dash*

在Centos里,/bin/sh链接到了bash

#ll /bin/sh
lrwxrwxrwx. 1 root root 4 2月  14 16:55 /bin/sh -> bash

所以在ubuntu里如果要使用bash要写成#!/bin/bash才行。
-e选项表示脚本中有任何错误都会终止执行脚本。

二 执行条件过滤

# Exit early if any session with my username is found
if who | grep -wq $USER; then
  exit
fi

脚本在主要代码执行前,首先要判断用户传入的参数、执行者的权限、文件目录是否存在等是否符合脚本执行的条件,所以会进行相应的判断,如果没达到符合的条件就会提示用户退出执行。在本例中,判断了脚本的所属者是否登录了系统,如果已经登录了就表明他已经来上班了,下面的请假过程就不用执行了。

三 声明变量

# Phone numbers
MY_NUMBER='+xxx'
NUMBER_OF_BOSS='+xxx'

定义字符串变量,分别存入本人和老板的电话号码。

EXCUSES=(
  'Locked out'
  'Pipes broke'
  'Food poisoning'
  'Not feeling well'
)

定义请假理由的数组

rand=$[ $RANDOM % ${#EXCUSES[@]} ]

随机抽取请假编号。${#EXCUSES[@]}代表数值元素的个数,然后通过与随机数的取余运算获得随机的编号。$[  ]为算数运算符号,与let、$(())等价

RANDOM_EXCUSE=${EXCUSES[$rand]}

取得数组中的某一项。

MESSAGE="Gonna work from home. "$RANDOM_EXCUSE

将消息头与随机项合并组成消息。

三 执行主要任务

# Send a text message
RESPONSE=`curl -fSs -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
  -d "From=$MY_NUMBER" -d "To=$NUMBER_OF_BOSS" -d "Body=$MESSAGE" \
  "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages"`

其中的$TWILIO_ACCOUNT_SID和$TWILIO_AUTH_TOKEN为环境变量,通过curl命令执行了登录网站发送短信的过程,并把执行的结果返回给RESPONSE变量。

四 判断执行的结果

# Log errors
if [ $? -gt 0 ]; then
  echo "Failed to send SMS: $RESPONSE"
  exit 1
fi

当脚本的主要代码执行完毕后,通过检测执行后的状态来判断脚本的执行结果,如果执行结果大于0,说明执行过程中出现了错误,后台执行的脚本会以发邮件的方式提示用户。

五 设置环境变量和周期执行

TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

此环境变量在用户未登录的情况下也要执行,所以不能设置在~/.bashrc ~/.bash_profil /etc/bashrc /etc/profile.d里,最好写在/etc/rc.local里

# Runs `hangover.sh` monday to friday at 8:45 am.
45 8 * * 1-5 /path/to/scripts/hangover.sh >> /path/to/hangover.log 2>&1

周一至周五的8点45分执行脚本,并输出日志。此任务没有用户名,应该是使用命令crontab -e编辑的。

六 总结

这位仁兄的代码简洁,注释清晰,内容包含了shell编程的主要步骤,值得我等新人研究学习。

原创文章,作者:realmaster,如若转载,请注明出处:http://www.178linux.com/72647

赞 (0)
realmasterrealmaster
上一篇 2017-04-06 15:09
下一篇 2017-04-06 19:20

相关推荐

  • MAN手册使用指南及快捷键键位整理

      MAN手册使用指南及快捷键键位整理 Man mnual 手册说明          基本使用:man 命令 Man一共可分为八个章节: man1,man2,man3,man4……man8 1:用户命令 2:系统调用 3:C库调用 4:设备文件及特殊文件 5:文件格式…

    Linux干货 2016-10-18
  • 2018/8/3作业

    问题: 在/data/testdir里创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。 groupadd g1         &…

    Linux干货 2016-08-05
  • Linux脚本基础练习

    马哥教育网络班+ 第7周课堂练习 Linux脚本基础练习 练习: 1、创建一个10G分区,并格式为ext4文件系统; (1)要求其block大小为2048,预留空间百分比为2,卷标为MYDATA,默认挂载属性包含acl (2)挂载至/data/mydata目录 要求挂载时禁止程序自动运行,且不更新文件的访问时间戳 第一步,在虚拟机中挂载一块20G的新硬盘 &…

    Linux干货 2016-11-09
  • 从Linux小白到大牛——与狼共舞的日子5

    马哥教育网络班21期+第5周课程练习 1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行。 [root@localhost ~]# grep '^[[:space:]]\+' /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以…

    Linux干货 2016-08-31
  • Linux系统的软链接和硬链接

    Linux的链接是一种共享文件和访问它的用户的若干目录项之间建立联系的一种方法。一共分为两种链接,分别是软链接和硬链接。 一、硬链接 1、硬链接的本质上是一个文件,它们除了名字不一样,其他都一样,占用的空间是一个。硬链接会增加文件的链接数。如下图 (1)建立硬链集之前     (2)建立硬链接之后 2、删去一个链接名,链接数减一…

    Linux干货 2016-10-22
  • linux下绘图工具rrdtool

    一、前言       为了做云缓存平台的技术储备,从零开始学习了rrdtool,rrdtool非常强大,刚接触会有摸不着边的感觉,尤其是一堆概念性的东西。学习的切入点便是这些概念,一一理解后你才能品尝到rrdtool的清香,首先要感谢ailms整理的“RRDtool简体中文教程 v1.01”,通俗易…

    Linux干货 2015-03-27