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.www58058.com/72647

(0)
realmasterrealmaster
上一篇 2017-04-06
下一篇 2017-04-06

相關推薦

  • Nginx反向代理的常用調度算法

    upstream 調度算法 1.rr 按客戶端請求順序把客戶端的請求逐一分配到不同的后端的服務器,這相當于lvs中的rr算法。如果后端服務器巖機(默認情況下只檢測80端口,如果后端報502,404,403,503,還是會直接返給用戶),巖機服務器會被自動剔除,使用戶訪問不受影響,請求會分配給正常的服務器 2.weight(權重) 在輪詢算法的基礎上加上權重(…

    Linux干貨 2016-06-01
  • ThirdWeek_SecondDay

    Python學習筆記整理

    Linux干貨 2017-10-09
  • Linux網絡屬性配置(三)修改配置文件&& CentOS 7 網絡配置

    Linux網絡屬性配置(三)&& CentOS 7網絡配置 Linux網絡屬性配置(三)修改配置文件&& CentOS 7 網絡配置 Linux網絡屬性配置(三)修改配置文件 IP、MASK、GW、DNS相關配置文件: /etc/sysconfig/network-scripts/ifcfg-IFACE 路由相關配置文件: /…

    Linux干貨 2016-07-07
  • 第十周作業

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;   (1) 為硬盤新建兩個主分區;并為其安裝grub; #創建兩個分區,/dev/sdb1為500M,/dev/sdb2為5G [root@centos6 mnt]# fdisk -l /dev/sdb…

    2017-03-12
  • LVS 之 初識LVS

    LVS 之 初識LVS LVS 之 初識LVS 0x00 概述 0x01 LVS拓撲結構圖: lvs集群類型中的術語 : 0x02 lvs-type lvs-nat lvs-dr lvs-tun lvs-fullnat : 0x03 調度算法(scheduler) 0x00 概述 LVS : Linux Virtual Server lvs 工作在 IOS …

    2017-05-11
  • Linux下軟件包安裝(rpm,yum)

    Linux下軟件包安裝(rpm,yum,源代碼) 1)    Rpm包管理安裝 2)    Yum包程序管理器 3)    本地Yum倉庫建制 ======================================= 1) …

    Linux干貨 2016-06-22
欧美性久久久久