以下操作皆以 Command Line 來執行
如何執行 Shell Script 的檔案
chmod +x <檔案名稱>
:這一步是讓檔案可以執行, x 表示可執行的意思
- chmod是變更檔案屬性。
./<檔案名稱>
:再輸入這一行指令
實際執行的樣子:
Shell Script 上的變數
MY_NAME="krebikshaw"
- 注意,在
=
前後是不能有空格的喔!
實際的內容長這樣
#!/bin/bash
MY_NAME="krebikshaw"
echo "My name is $MY_NAME"
#!/bin/bash
:這行是代表bash 在 /bin/ 下面,因為我們是以 bash shell 當作範例echo
: 表示將資料列印在畫面上$
:當我們要使用變數時,就必須要在變數前面加上 $ 符號
從 Command Line 執行 Shell Script
cat
就是 Command Line 的指令,可以查看 test1.sh 的內容
在舉第二個例子
#!/bin/bash
echo -n "你好!請輸入你的年齡:"
read AGE
echo "你輸入的年齡是 $AGE 歲"
Shell Script 的判斷式
# 如果判斷式為真,就執行 do something 1
if [ 判斷式 ]; then
do something 1
fi
# 如果判斷式為真,就執行 do something 1, 否則就執行 do something 2
if [ 判斷式 ]; then
do something 1
else
do something 2
fi
# 如果判斷式為真,就執行 do something 1, 為假往下執行看 判斷式2 是否為真
# 為真就執行 do something 2, 否則就執行 do something 3
if [ 判斷式 ]; then
do something 1
elif [ 判斷式2 ]; then
do something 2
else
do something 3
fi
- 以
if
開頭,以fi
結尾 elif
就是 else if 的意思
將上面的範例加上判斷式
#!/bin/bash
echo -n"你好!請輸入你的年齡:"
read AGE
if [ $AGE -eq 18 ]; then
echo "恭喜你,你剛滿 18 歲"
elif [ $AGE -lt 18 ]; then
echo "你還未成年喔!"
else
echo "你已經成年了!"
fi
echo "你輸入的年齡是 $AGE 歲"
-eq, -lt 的意思如下
-eq
:等於-ne
:不等於gt
:大於ge
:大於等於lt
:小於le
:小於等於
Command Line 的執行結果
debug 方式可以參考這篇
Shell Script 的迴圈
第一種迴圈表示方式:
While [ condition ] do command1 command2 … done
當 condition 為 true 就會執行 do 的內容。
第二種迴圈表示方式:
for ((起始條件; 終止條件; 每一圈要做的事)) do ...... done
第三種迴圈表示方式:
for keyword in name like blog do ...... done
- 把 keyword 分別用 name, like, blog 三個參數帶入,並且執行。
- 也就是一共會執行三圈的迴圈
Shell Script 的函式
function_name() { // 一個叫做 function_name 的函式
內容
}
function_name // 呼叫函式
綜合練習
題目:
寫一個 shell script,可以傳入一個數字 n,然後會產生 1~n 個檔案,檔名是 {number}.js。 (舉例來說:./num.sh 10會產生1.js、2.js...10.js。)
- 我們來把解題流程寫下來
- 接收使用者所輸入的參數 n
- 建立一個 1 ~ n 的迴圈
- 每一圈要建立一個新的檔案叫做 {number}.js
#!/bin/bash
for ((i=1; i<=$1; i++))
do
touch "$i.js"
done
echo "建立檔案完成!"
進階運用 - 用 Shell Script 處理字串
awk -F'<要切開的標的物>''{print $1}'
- 把字串用 <標的物> 切開後,取第一塊
實際案例:
#!/bin/bash
MY_NAME="Peter:123456:man"
echo $MY_NAME | awk -F':' '{print $1}'
echo $MY_NAME | awk -F':' '{print $2}'
echo $MY_NAME | awk -F':' '{print $3}'
- 有一個 MY_NAME 字串,內容是 Peter:123456:man
- 我把字串用
:
切開,會切成三塊Peter
,123456
,man
{print $1}
可以取出第一塊Peter
- 執行後會長這樣:
我們把字串處理結合實際案例
先給你一個 api 資料,只要下指令 curl
https://api.github.com/users/ 加上帳號,就可以看到這個帳號的個人資訊
(以 Huli 老師的個人資訊作為範例,如下圖)
接著我們試著從這份資料上取得 Huli 老師的:
- name :姓名
- bio :興趣
- location :地點
- blog :部落格連結
#!/bin/bash
curl -silent https://api.github.com/users/$1 > temp.txt
for keyword in name bio location blog
do
grep -e $keyword temp.txt | awk -F'"' '{print $4}'
done
- 用
curl -silent
指令去抓,GitHub 上的個人資料,並寫進一個 temp.txt - 利用迴圈,將 keyword 分別用 name, bio, location, blog 帶入後執行
- 把 存放在 temp.txt 的 keyword
grep
出來 - 利用
awk -F
指令,把資料從"
切開,並取得切開後的第四塊資料
我們來看看執行的結果吧:
參考資料:
[第一週] Shell Script 腳本
快快樂樂學會讓電腦幫我做事
shell script的 字串處理,取代符號的用法,awk 以及 sed