• Like
  • Save
新北市教師工作坊 -- Bash script programming 介紹
Upcoming SlideShare
Loading in...5
×
 

新北市教師工作坊 -- Bash script programming 介紹

on

  • 644 views

2014/06/24 在新北市蘆洲國中的教師工作坊,介紹 bash script programming 基礎

2014/06/24 在新北市蘆洲國中的教師工作坊,介紹 bash script programming 基礎

Statistics

Views

Total Views
644
Views on SlideShare
640
Embed Views
4

Actions

Likes
7
Downloads
21
Comments
0

1 Embed 4

http://www.slideee.com 4

Accessibility

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    新北市教師工作坊 -- Bash script programming 介紹 新北市教師工作坊 -- Bash script programming 介紹 Presentation Transcript

    • Bash Script 介紹 Franklin 2014/06/24
    • 何謂 Shell? Shell Core User Shell :程式核心與使用者溝通的介面
    • Shell 的例子 ● PC-DOS, MS-DOS ● Windows 下的 Cmd.exe ● Sh / csh / bash / zsh / …... ● Shell 一定是指文字介面 ?嗎 – Gnome shell
    • /bin/sh : bash vs dash ● Ubuntu /bin/sh 預設指向 dash ● dash 比較輕量,比較有效率,但有些功能與參 數未實作 ● 今天的討論以 bash 為主
    • Shell script 的 Shebang: #! ● 指示系統要呼叫 一個哪 shell interpreter – #!/bin/sh – #!/bin/bash – #!/bin/python – #!/usr/bin/env python ● 不是必要,但沒有的話 ... – POSIX: the results are unspecified. – 預設是找 /bin/sh 但不同系統不見得一樣
    • Hello World #!/bin/bash echo "Hello World!" echo "Today is `date +%x`" echo 'Another example is date +%x' 重點: echo, 雙引號 ", 單引號 ', 反單引號 ` 雙引號:裡面的變數、應用程式等會被展開 單引號:忠實呈現原本內容 反單引號:執行裡面的程式並將結果帶入
    • 變數定義與使用 #!/bin/bash MONTH=`date +%m` DATE=`date +%d` echo " 今天是 $MONTH 月 $DATE 日。 " echo " 今天是 ${MONTH} 月 ${DATE} 日。 " 重點:變數的使用 $MONTH 與 ${MONTH} 其實是一樣的, 但是後者可以避免誤判變數名稱。
    • 字串變數 #!/bin/bash STR="A B C D" echo $STR echo "$STR" 重點:引號的加入還有一個保護空白字元的作用。
    • Exercise 1 ● 利用變數取得現在的時刻(時、分)並印出「現 在是 xx 點 xx 分」的訊息。 – 提示: man date 看看怎麼取得現在的時、分 – 運用字串變數
    • 參考答案 1 #!/bin/bash HOUR=`date +%H` MIN=`date +%M` echo " 現在是 ${HOUR} 點 ${MIN} 分。 "
    • 測試條件: test #!/bin/bash DAY=`date +%d` if [ ${DAY} -eq 5 ]; then echo " 發薪水囉! " elif [ ${DAY} -ge 28 ]; then echo " 沒錢了 ..." else echo " 過日子。 " fi 重點: test , 中括號 [ ], if, elif, then, -eq, -ge ● test 搭配 if, while 等使用 ● 條件判斷式 ● 注意 if 的語法,分號的位 置 ● 字串變數判斷方式要留意, 容易造成錯誤
    • 測試條件: test ● 常用的測試子 – ( ) : true, ! : not – -a : and, -o : or – 數 比較:值 -eq, -gt, -lt, -ge, -le, -ne – 字串比較: =, != – 注意 = 與 -eq 的不同 – 字串判斷: -z, -n – 常用 案判斷:檔 -b, -c, -d, -e, -f, -r, -w, -x ● 看一下男人吧! man test
    • 迴圈: while, until #!/bin/bash i=0 while [ $i -lt 10 ]; do echo "i=$i" let i+=1 done #!/bin/bash i=0 until [ $i -eq 10 ]; do echo "i=$i" let i+=1 done 重點: while, until 語法
    • 迴圈: for #!/bin/bash for FILENAME in /usr; do echo "$FILENAME" done #!/bin/bash for FILENAME in /usr/*; do echo "$FILENAME" done 重點: for 語法,還有元素內容
    • Exercise 2 ● 找出 /usr/lib 中有幾個目錄、幾個執行 、幾個符號連結,還有檔 幾個其他的 案。檔 ● 提示: – man test – 使用 for 迴圈 – 使用變數 – 使用 let 來增加變數值
    • 參考答案 2 #!/bin/bash DIR=0 SYMLINK=0 EXEC=0 OTHER=0 for FILE in /usr/lib/*; do if [ -d $FILE ]; then let DIR+=1 elif [ -x $FILE ]; then let EXEC+=1 elif [ -L $FILE ]; then let SYMLINK+=1 else let OTHER+=1 fi done echo "Dir:$DIR, Exec: $EXEC, SYMLINK: $SYMLINK, OTHER:$OTHER"
    • Bash Script 參數處理 #!/bin/bash echo "0=$0, 1=$1, 2=$2" if [ $1 = "Good" ]; then echo "Thanks." else echo "Oops..." fi 重點: $0, $1, $2 $0: 程式名稱 $1: 第一個參數 執行: ./test.sh Good ya 如果只輸入 ./test.sh ?呢
    • Bash Script 參數處理(修正) #!/bin/bash echo "0=$0, 1=$1, 2=$2" if [ "$1" = "Good" ]; then echo "Thanks." else echo "Oops..." fi 重點:字串判斷時需要 留意空字串的問題。 Bash 沒有聰明到瞭解你的 $1 可能是空字串,會直接給你 一個 parsing error
    • Bash Script 參數處理(修正 2 ) #!/bin/bash echo "0=$0, 1=$1, 2=$2" if [ -z "$1" ]; then echo "No parameters." elif [ "$1" = "Good" ]; then echo "Thanks." else echo "Oops..." fi 重點:判斷空字串的方式
    • Bash Script 的輸出入處理 #!/bin/bash ls -lR /usr > /tmp/usr.list 2>&1 RET=$? if [ $RET -ne 0 ]; then echo "ls failed." fi 重點: >, >&, $? $?: 前一次執行 的傳回值
    • 導向符號 ● > : 將標準輸出 (stdout) 導到 案去(覆寫)檔 – ls -lR /usr > /tmp/file.list ● >> : 將標準輸出導到 案去(附加)檔 – ls -lR /var >> /tmp/file.list ● >& : 一樣是導向,但導向目的是另一個 fd – ls -lR /home >> /tmp/file.list 2>&1 – fd: 0 – stdin, 1 – stdout, 2 – stderr ● | : pipe,將前面程式執行結果的輸出導入另一個程式的輸入 – ls -l / | grep home – 很常跟其他工具合用,如 sed, awk, grep
    • Exercise 3 ● 用 wget 抓取以下 案,並判斷是否成功。檔 – ftp://goodhorse.idv.tw/tetris.sh ● 提示: – wget, $? – man wget
    • 參考答案 3 #!/bin/bash wget ftp://goodhorse.idv.tw/tetris.sh RET=$? if [ $RET -ne 0 ]; then echo "wget failed." fi
    • Bash Script 的函式 #!/bin/bash printValue() { if [ -z "$1" ]; then echo "Empty value" else echo "parameter=$1" fi } printValue i=0 until [ $i -eq 10 ]; do printValue $i let i+=1 done 重點:函式宣告與應用 ● 直接定義 ● 參數不必寫在定義,在函式內 直接使用 $1, $2 來存取
    • 載入其他 案內容:檔 Source ● 可以將設定單獨拉出來,較容易維護。 ● source 的 alias: . – . /etc/default/locale
    • 再談談變數 #!/bin/bash declare -i NUM NUM=4*2 echo $NUM 重點: declare 雖然 bash 中的變數,根據官方說法 是沒有型態的,但還是可以透過 declare 將變數宣告成特定的型態。 -i: 整數, -a | -A : 陣列, -f : 函 式, … 等等。 用 +i 則將變數的整數型態取消(恢 復成字串)。
    • 與使用者互動 #!/bin/bash echo -n " 請輸入姓名: " read NAME echo "Hello, $NAME." 重點:用 read 讀取鍵盤輸入,並傳遞到變數。 注意 read 後面放的是變數名稱( NAME )而非參考( $NAME )
    • 與 Shell Script 搭配的常用工具 ● grep ● sed ● awk ● zenity / kdialog
    • grep ● 從輸出中找出符合正規表示式的行 – ps axw | grep ba.h – dmesg | grep eth0 ● 搭配 -r 可以遞迴搜尋 案中的文字檔 – grep -r bash * ● -v: 反向(濾掉文字)
    • awk ● 字串處理工具,可以將輸入的行分欄位印出。 – ps axw | awk ' { print $1 " " $5 }; ' ● 也可以加入一些簡單的判斷式。 – ps axw | awk ' { if ($1 >= 4000 && $1 <= 5000) {print $1 " " $5} } '
    • sed ● Stream editor ,可以透過正規表示式過濾並轉換 字串。 – uname -a | sed 's/Linux/ezgo/g' ● 它也可以直接替換 案的內容。檔 – sed -ri 's/tw.archive.ubuntu.com/free.nchc.org.tw/' /etc/apt/sources.list
    • zenity / kdialog ● 產生一個簡單的視窗,提供資訊 / 詢問動作 / 進度條 / 顯示警告、 錯誤 ... ● zenity : based on GTK+, kdialog: based on QT #!/bin/bash zenity --info --text "Bash script 課程即將完成。 " kdialog --yesno " 請問還滿意 ?嗎 " zenity --question 與 kdialog --yesno 等,對不同答案的傳回 會不同。值 可以使用 $? 來取得答案。
    • Exercise 4 ● 取出主機上目前所有的 IP address ● 提示: – ip addr – grep inet – awk
    • 參考答案 4 #!/bin/sh ip addr | grep inet | awk ' { print $2; }'
    • 其他應用 ● switch case ● alias ● array ● …...
    • 總結 ● Bash script 本身的語法不多,但跟工具組合起來 之後就變化多端。 ● 一些進階的語法、用法不用強記,需要用的時候 可以去 。查 ● 瞭解更多工具的用法,讓 script 更強大。
    • 實用範例 1: 每日備份 ● 使用變數紀錄日期、時間,並決定 名檔 ● 執行壓縮 #!/bin/bash FILENAME=/opt/backup/ezgo_`date +%m%d`.tar.gz tar cfpvz ${FILENAME} /home/ezgo
    • 實用範例 2: 檢 硬 空間查 碟 ● 結合 df, grep, tr, awk 等工具 – df | grep -v ' 案系統檔 ' | tr -d '%' | awk ' { if ( $5 >= 80) { print $1 " " $5 " " $6 }} '
    • 實用範例 3: 檢查 ppp0 是否存在 #!/bin/bash CHECK=`/sbin/ifconfig ppp0 | grep "inet addr"` if [ -z "${CHECK}" ]; then /etc/init.d/network-manager restart fi 另一個檢 空字串的做法:查 if [ "${CHECK}z" = "z" ]; then
    • 點歌時間 ● 大家一起來做做看!