程式導師實驗計畫 [第一週] 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 | # 當發生錯誤時停止腳本 |
那時候根本不知道這段在寫什麼,只知道照個做可以讓我的程式部署到 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 | name=lukelin |
1 | name=lukelin |
需要注意的是,=
等號的兩側不能有空白,不然就會壞掉。
變數定義變數
可以把用指令回傳回來的資料再定義成一個變數,需要用 ` 關鍵字把指令包起來。
例如把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 | data=`curl -X GET https://api.github.com/users/$1 | jq '.'` |
再執行 sh github.sh milletbard
,就可以看到這樣的結果。
以上就是這篇的筆記內容