程式導師實驗計畫 [第一週] shell script 程式化腳本

理解 shell script

有一種東西叫做 shell script,可以用 command line 指令以及一些語法寫成一個腳本,執行之後可以很方便地做很多事。

前面整理了 程式導師實驗計畫 [第一週] Command-line-入門筆記,理解了可以使用 CLI(Command Line Interface) 的方式來操控電腦,那如果有一些指令是固定要用到的。

就像提交 commit 或是部署程式,每次都要一行一行打,如果我很懶想要有個程式幫我處理這些固定的指令可以嗎? 可以,shell script 就可以做到。

第一次接觸到 shell script 是在部署 vue 的程式到 GitHub 的時候,vue 的 官方文件 告訴你

  • 在項目目錄下,創建內容如下的 deploy.sh(可以適當地取消註釋)並運行它以進行部署:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 當發生錯誤時停止腳本
set -e

# 建構
npm run build

# cd 到建構輸出的目录下
cd dist

# 部署到自定義域名
# echo 'www.example.com' > CNAME

git init
git add -A
git commit -m 'deploy'

# 部署到 https://<USERNAME>.github.io
# git push -f git@github.com:<USERNAME>/<USERNAME>.github.io.git master

# 部署到 https://<USERNAME>.github.io/<REPO>
# git push -f git@github.com:<USERNAME>/<REPO>.git master:gh-pages

cd -

那時候根本不知道這段在寫什麼,只知道照個做可以讓我的程式部署到 GitHub 上面去XD

也就是說,其實 shell script 就是在幫我們把想打的指令存下來,如果你執行它,它就幫你把你存在裡面的指令一行一行打出來,完成你想做的事情。


練習 shell script

練習一

寫一個 shell script,檔名叫test.sh,執行test.sh可以傳入一個 number,


接著印出echo {number}

運用之前學到東西,在終端機進行。

使用touch新增檔案

1
touch test.sh

使用vim文字編輯器進入編輯模式

1
vim echo.sh

新增內容

1
echo "echo $1"

執行 test.sh 檔案,嘗試印出 5

1
sh ./test.sh 5

練習二

寫一個 shell script,名為 abc.sh, abc.sh 可以傳入一個數字 number,產生名為 {number}.js 的檔案。


新增 abc.sh 檔案,新增內容

abc.sh

1
touch "$1.js"

執行 abc.sh

1
sh ./abc.sh

練習三

寫一個 shell script,名為 num.sh, num.sh 可以傳入一個數字 n,然後會產生 1~n 個檔案,檔名是 {number}.js。


新增 abc.sh 檔案,新增內容

num.sh

1
for i in `seq 1 $1`; do touch $i.js; done;

執行 num.sh

1
sh ./num.sh

語法整理

練習後來重新整理一下 shell script 的語法

在 shell script 中,變數都視為字串,不用定義變數類型。

變數的使用

shell script 對單引號視為字串,對雙引號視為變數。

1
2
3
name=lukelin
echo "$name" # 雙引號
# output : lukelin

1
2
3
name=lukelin
echo '$name' # 單引號
# output : 視 '$name' 為文字 ,印出 '$name'

需要注意的是,=等號的兩側不能有空白,不然就會壞掉。

變數定義變數

可以把用指令回傳回來的資料再定義成一個變數,需要用 ` 關鍵字把指令包起來。

例如把curl撈出來的東西定義給data這個變數

挑戰題

請寫一個 github.sh,可以傳入一個參數 username,執行之後就會輸出這個 GitHub 使用者的暱稱、介紹、地點跟個人網站。


要完成這題,要透過一個 username 去撈 github 的資料,所以需要先去看一下 GitHub Developer
Docs

可以看到機器的位置https://api.github.com以及如果要撈使用者資訊需要帶的參數。

所以需要用的 API 變成

1
https://api.github.com/users/username

再來是需用到之前學到的 curl : 發送 request

所以 github.sh 的內容就可以是這樣

github.sh username <= 帶入想查詢的 github 帳號

1
echo curl -X GET https://api.github.com/users/$1

檢視 JSON 工具 - jq

jq 可以讓 JSON 的格式排成較易閱讀的方式來觀看

官方安裝 : https://stedolan.github.io/jq/download/

  • OS X

    • Use Homebrew to install jq 1.5 with brew install jq.

使用 curl取得資料並透過 jq 顯示出指定的資料

1
2
3
4
5
data=`curl -X GET https://api.github.com/users/$1 | jq '.'`
echo $data | jq '.name'
echo $data | jq '.bio'
echo $data | jq '.location'
echo $data | jq '.blog'

再執行 sh github.sh milletbard,就可以看到這樣的結果。

 以上就是這篇的筆記內容

程式導師實驗計畫第三期