初識 shell script


Posted by ai86109 on 2020-06-14

雖然之前有看過這個名詞,但一直下意識地忽略他,因為總覺得應該是個很難的東西,但這次把本週作業寫完後,想說還有時間就來研究看看吧,大不了就是不會而已也沒什麼。

Shell script 可以把它拆開來看,shell 是一個讓我們用文字去跟電腦核心溝通互動的介面(常聽到的 bash 就是一種 shell),什麼意思呢?當我們要讓電腦播出音樂時,我們可以透過 shell 或是其他應用程式介面,去告訴電腦核心(Kernel),核心就可以去操控硬體(音效卡)放出音樂。至於為什麼叫 shell,你可以想成他是雞蛋殼,核心和硬體則是蛋白和蛋黃,一種階層的概念。Script 則是腳本,所以合起來就是『針對 shell 寫的腳本』。

關於什麼是 shell 可以參考這篇:鳥哥的 Linux 私房菜 - 第十二章、學習 Shell Scripts

所以其實 shell script 就是利用 shell 的功能所寫的一個程式,我們可以用 command line 指令和一些語法寫成一個腳本,可以更方便的執行一些動作。先確定你已經對於 command line 有基本的認識了。如果還不太熟可以看一下我之前寫的:讓你好像很厲害的Command Line 這篇。

直接看程式碼應該會比較好理解,首先你要知道這類檔案的副檔名是 .sh,我們就先幫這個檔案取一個叫 test.sh 好了

#!/bin/bash
# 我是註解
touch "$1.js";
echo "檔案建立完成";

第一行會先宣告這個 script 所使用的 shell,因為我們使用的 shell 是 bash,所以就宣告#!/bin/bash

除了第一行之外,後面的行數只要加上#開頭,就是註解

再來看一下主要程式碼部分,可以很清楚看出來,這個程式在被呼叫之後,他首先會建立一個 .js 的檔案(先忽略 $1,等等會講),然後印出檔案建立完成,十分好懂。

那要怎麼呼叫這個程式呢?
首先我們要先更改檔案權限。+ 就是新增,x 是執行權限
chmod +x [test.sh](http://test.sh/)
這樣就可以取得執行的權限了
指令可以參考這裡:chmod 指令- 修改檔案目錄權限

./test.sh abc 表示執行 test.sh 並帶入參數 abc
之前有看到 $1 對吧,這就代表帶入的第一個參數,以此類推。
所以執行後就會建立一個叫做 abc.js 的檔案,這就是一個簡單使用 shell script 的例子。


挑戰題

現在請你寫一個 shell script,可以傳入一個數字 n,然後會產生 1~n 個檔案,檔名是 {number}.js
舉例來說:./num.sh 10會產生1.js2.js...10.js

#!/bin/bash

for((i=1;i<=$1;i++))
do
    touch "$i.js"
done

這題滿容易的,只要去找到迴圈的寫法就可以了。


超級挑戰題

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

範例:

./github.sh aszx87410

輸出:
Huli
Love coding, teaching, and writing. Believe sharing can make the world a better place.
Taipei, Taiwan
https://medium.com/@hulitw

直接先看我的寫法吧

#!/bin/bash

# 使用 curl 將資料帶入變數 data,因為是 HTTP GET 所以不用加 option
# 這邊使用 silent 模式,使之不輸出任務內容
data=$(curl --silent https://api.github.com/users/$1)

# for var in con1 con2 con3 所以在跑迴圈時,第一圈會帶 con1,以此類推
# 如果寫成'name',會找到所有有 name 的,像是 twitter_username 也會被找到
for i in '"name"' '"bio"' '"location"' '"blog"'
do
    if [ "$i" == '"blog"' ]
        then
            echo "${data}" | grep $i | cut -d':' -f 2-3 | cut -d'"' -f 2
        else
            echo "${data}" | grep $i | cut -d':' -f 2 | cut -d'"' -f 2
    fi
done

這邊 curl 的用法之前已經講過
可以參考這篇:curl 指令用法
或這篇:Linux Curl Command 指令與基本操作入門教學

silent 模式可以參考:curl 命令行工具的使用及命令参数说明

api 網址則是參考提示的 XD

迴圈的使用可以查,還滿容易就可以找到的。
再來簡單說一下,echo 後面的指令:
echo "${data}" | grep $i | cut -d':' -f 2 | cut -d'"' -f 2 為例,取出 data 的資料,因為第一圈是 name,所以 i 就是 name,grep 可以取出有關鍵字的一整行,所以到這裡會印出 "name": "Huli",

接下來用 cut。-d 表示指定分隔字元,-f 是輸出指定的範圍,以欄位為一個單位,所以說 cut -d':' -f 2 表示我這邊用冒號作為分割的點,左邊的"name" 是第一個欄位,右邊的 "Huli", 是第二個欄位,再來用 -f 輸出 2,也就是輸出第二欄位的意思,到這裡會印出 "Huli",

最後,cut -d'"' -f 2 很簡單,就是用“當作分割點,所有會有3個欄位,第一個欄位是一個空白,第二個欄位就是 Huli,第三個是逗點,所以輸出第二欄位就是我們要的了。

另外,原本想用 --complement,但似乎沒有支援這個語法?

參考資料:
Linux 的 cut 擷取部份字元、欄位指令教學與常用範例整理
cut 指令: 擷取檔案每行指定範圍資料
bash - 如何使用'cut'查找最後一個欄位 Linux


#shell script #bash







Related Posts

Print lots of stars

Print lots of stars

曼陀號領航計畫(1) 報名到錄取

曼陀號領航計畫(1) 報名到錄取

CSS 動態效果 補

CSS 動態效果 補


Comments