第一次學習 Shell Script - 隨手記


Posted by krebikshaw on 2020-06-14

以下操作皆以 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 的迴圈

  1. 第一種迴圈表示方式:

    While [ condition ]
    do
     command1
     command2
     …
    done
    

    當 condition 為 true 就會執行 do 的內容。

  2. 第二種迴圈表示方式:

    for ((起始條件; 終止條件; 每一圈要做的事))
    do 
      ......
    done
    
  3. 第三種迴圈表示方式:

    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。)

  • 我們來把解題流程寫下來
    1. 接收使用者所輸入的參數 n
    2. 建立一個 1 ~ n 的迴圈
    3. 每一圈要建立一個新的檔案叫做 {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}'
  1. 有一個 MY_NAME 字串,內容是 Peter:123456:man
  2. 我把字串用 : 切開,會切成三塊 Peter, 123456, man
  3. {print $1} 可以取出第一塊 Peter
  • 執行後會長這樣:

我們把字串處理結合實際案例

先給你一個 api 資料,只要下指令 curl https://api.github.com/users/ 加上帳號,就可以看到這個帳號的個人資訊

(以 Huli 老師的個人資訊作為範例,如下圖)

接著我們試著從這份資料上取得 Huli 老師的:

  1. name :姓名
  2. bio :興趣
  3. location :地點
  4. 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
  1. curl -silent 指令去抓,GitHub 上的個人資料,並寫進一個 temp.txt
  2. 利用迴圈,將 keyword 分別用 name, bio, location, blog 帶入後執行
  3. 把 存放在 temp.txt 的 keyword grep 出來
  4. 利用 awk -F 指令,把資料從 " 切開,並取得切開後的第四塊資料

我們來看看執行的結果吧:

參考資料:
[第一週] Shell Script 腳本
快快樂樂學會讓電腦幫我做事
shell script的 字串處理,取代符號的用法,awk 以及 sed


#shell script







Related Posts

Redux 的三大要件與觸發順序

Redux 的三大要件與觸發順序

Sequelize 的 createdAt 時間不對

Sequelize 的 createdAt 時間不對

前端與後端的差異

前端與後端的差異


Comments