iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 10
0
自我挑戰組

30 天的 ShellScript 教室解決開發者的困擾系列 第 10

[鐵人賽第10天] 如何撰寫 Shell Script

  • 分享至 

  • xImage
  •  

寫了十天,有點基本概念了,今天來寫 Script 吧(終於)。

先隨手抓一個 ShellScript 來看看吧(出處:個人用來抓學校課表的 ShellScript):

#!/bin/bash
TARGET_SEM='1051'
OUTPUT_FILE='unifi.html'
LESSONS='http://aisap.nutc.edu.tw/public/subject_list.js'
LESSON_DETAIL='http://aisap.nutc.edu.tw/public/day/course_list.aspx?sem='"$TARGET_SEM"'&subject='

echo ' ' > $OUTPUT_FILE

curl "$LESSONS" | grep '\_'"$TARGET_SEM" 
...
...
...

恩,後面都是 Shell 指令,之前介紹過沒什麼問題,不過第一行是什麼?

#!/bin/bash

一般而言, Shell Script 裡面 # 開頭的表示這行是註解,不會實際執行到。不過第一行的 #! 雖然確實不會執行到,但是卻有很重要的功能:

這會決定接下來這個 Script 要用哪個 Shell 執行,畢竟 Unix Like 下的系統,只要加上執行檔的權限,文字檔都是執行檔。可是要怎麼知道這個是 Ruby 、 Python 還是 Shell 的 Script 呢?再說 Shell 有那麼多種,所以我說到底是哪個 Shell ?

副檔名?那也頂多判斷這是 RubyPython 還是 Shell ,然而這依然解決不了「該用哪個 Shell 」的問題,所以這個「看起來是註解的 #! 」就很好用啦,後面的 /bin/shell 不就讓電腦知道該怎麼執行這個檔案了嗎 XD

後面是我的習慣,我會習慣把各種參數丟在最前面宣告,這樣要改也很容易(像是明年要用就直接把 1051 改成 1061 ),不用找半天我把東西藏在哪。

有些人也會習慣在宣告變數前,紀錄這支 Script 的更新紀錄,但是我實在懶惰,再加上有 git 有 commit log 有 Release Tag,我個人是覺得沒啥必要特別寫 changelog 。

下面就是很普通很普通的 Shell 指令,存成文字檔就是 ShellScript。

不過寫成 Script 跟自己下指令有個很大的差異:你可能會需要使用者回答問題,好讓剩下的步驟可以自動完成。那這該怎麼做呢?

read  -p 'enter your tank model:' VAR_YOUR_TANK

插入這個指令, Shell 就會停下來,等使用者輸入內容按下 Enter 後,把他輸入的字串送進 VAR_YOUR_TANK 後,才繼續執行後面的指令。

至於暫停,大部分的指令都是執行完才會繼續下去,但是如果你堅持要他等個 5 秒再繼續,可以用下面的指令:

sleep 5

這樣就算執行完了,依然會等個五秒才繼續執行。

今天就寫到這裡吧,至於你說寫 ShellScript 的工具嘛,目前我自己都是慣用的文字編輯器 vim 而已,沒啥特別的工具,但是怪方法倒是不少,不過寫 ShellScript 的怪方法就等下次吧。


我是誰?
我是 dd-han ,可以叫我呆翰,是國立臺中科技大學的延畢生 與 創科資訊的時習生。


上一篇
[鐵人賽第09天] 介紹管線與 grep 指令
下一篇
[鐵人賽第11天] 使用 for 迴圈
系列文
30 天的 ShellScript 教室解決開發者的困擾23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言