0
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 pyth...
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} 日。 "
重點:...
字串變數
#!/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 " 沒錢了 ......
測試條件: test
●
常用的測試子
– ( ) : true, ! : not
– -a : and, -o : or
– 數 比較:值 -eq, -gt, -lt, -ge, -le, -ne
– 字串比較: =, !=
– 注意 = 與...
迴圈: 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...
迴圈: for
#!/bin/bash
for FILENAME in /usr; do
echo "$FILENAME"
done
#!/bin/bash
for FILENAME in /usr/*; do
echo "$FILENAME"...
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 $F...
Bash Script 參數處理
#!/bin/bash
echo "0=$0, 1=$1, 2=$2"
if [ $1 = "Good" ]; then
echo "Thanks."
else
echo "Oops..."
fi
重點: $0...
Bash Script 參數處理(修正)
#!/bin/bash
echo "0=$0, 1=$1, 2=$2"
if [ "$1" = "Good" ]; then
echo "Thanks."
else
echo "Oops..."
fi
...
Bash Script 參數處理(修正 2 )
#!/bin/bash
echo "0=$0, 1=$1, 2=$2"
if [ -z "$1" ]; then
echo "No parameters."
elif [ "$1" = "Good...
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...
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
}
printValu...
載入其他 案內容:檔 Source
●
可以將設定單獨拉出來,較容易維護。
●
source 的 alias: .
– . /etc/default/locale
再談談變數
#!/bin/bash
declare -i NUM
NUM=4*2
echo $NUM
重點: declare
雖然 bash 中的變數,根據官方說法
是沒有型態的,但還是可以透過
declare 將變數宣告成特定的型態。
-i:...
與使用者互動
#!/bin/bash
echo -n " 請輸入姓名: "
read NAME
echo "Hello, $NAME."
重點:用 read 讀取鍵盤輸入,並傳遞到變數。
注意 read 後面放的是變數名稱( 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 && $...
sed
●
Stream editor ,可以透過正規表示式過濾並轉換
字串。
– uname -a | sed 's/Linux/ezgo/g'
●
它也可以直接替換 案的內容。檔
– sed -ri 
's/tw.archive.ubunt...
zenity / kdialog
●
產生一個簡單的視窗,提供資訊 / 詢問動作 / 進度條 / 顯示警告、
錯誤 ...
● zenity : based on GTK+, kdialog: based on QT
#!/bin/bash
z...
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} /...
實用範例 2: 檢 硬 空間查 碟
●
結合 df, grep, tr, awk 等工具
– df | grep -v ' 案系統檔 ' | tr -d '%' |
awk ' { if ( $5 >= 80) { print $1 " "
$...
實用範例 3: 檢查 ppp0 是否存在
#!/bin/bash
CHECK=`/sbin/ifconfig ppp0 | grep "inet
addr"`
if [ -z "${CHECK}" ]; then
/etc/init.d/net...
點歌時間
●
大家一起來做做看!
Upcoming SlideShare
Loading in...5
×

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

943

Published on

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

Published in: Technology, News & Politics
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
943
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
26
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

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

  1. 1. Bash Script 介紹 Franklin 2014/06/24
  2. 2. 何謂 Shell? Shell Core User Shell :程式核心與使用者溝通的介面
  3. 3. Shell 的例子 ● PC-DOS, MS-DOS ● Windows 下的 Cmd.exe ● Sh / csh / bash / zsh / …... ● Shell 一定是指文字介面 ?嗎 – Gnome shell
  4. 4. /bin/sh : bash vs dash ● Ubuntu /bin/sh 預設指向 dash ● dash 比較輕量,比較有效率,但有些功能與參 數未實作 ● 今天的討論以 bash 為主
  5. 5. Shell script 的 Shebang: #! ● 指示系統要呼叫 一個哪 shell interpreter – #!/bin/sh – #!/bin/bash – #!/bin/python – #!/usr/bin/env python ● 不是必要,但沒有的話 ... – POSIX: the results are unspecified. – 預設是找 /bin/sh 但不同系統不見得一樣
  6. 6. Hello World #!/bin/bash echo "Hello World!" echo "Today is `date +%x`" echo 'Another example is date +%x' 重點: echo, 雙引號 ", 單引號 ', 反單引號 ` 雙引號:裡面的變數、應用程式等會被展開 單引號:忠實呈現原本內容 反單引號:執行裡面的程式並將結果帶入
  7. 7. 變數定義與使用 #!/bin/bash MONTH=`date +%m` DATE=`date +%d` echo " 今天是 $MONTH 月 $DATE 日。 " echo " 今天是 ${MONTH} 月 ${DATE} 日。 " 重點:變數的使用 $MONTH 與 ${MONTH} 其實是一樣的, 但是後者可以避免誤判變數名稱。
  8. 8. 字串變數 #!/bin/bash STR="A B C D" echo $STR echo "$STR" 重點:引號的加入還有一個保護空白字元的作用。
  9. 9. Exercise 1 ● 利用變數取得現在的時刻(時、分)並印出「現 在是 xx 點 xx 分」的訊息。 – 提示: man date 看看怎麼取得現在的時、分 – 運用字串變數
  10. 10. 參考答案 1 #!/bin/bash HOUR=`date +%H` MIN=`date +%M` echo " 現在是 ${HOUR} 點 ${MIN} 分。 "
  11. 11. 測試條件: 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 的語法,分號的位 置 ● 字串變數判斷方式要留意, 容易造成錯誤
  12. 12. 測試條件: 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
  13. 13. 迴圈: 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 語法
  14. 14. 迴圈: for #!/bin/bash for FILENAME in /usr; do echo "$FILENAME" done #!/bin/bash for FILENAME in /usr/*; do echo "$FILENAME" done 重點: for 語法,還有元素內容
  15. 15. Exercise 2 ● 找出 /usr/lib 中有幾個目錄、幾個執行 、幾個符號連結,還有檔 幾個其他的 案。檔 ● 提示: – man test – 使用 for 迴圈 – 使用變數 – 使用 let 來增加變數值
  16. 16. 參考答案 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"
  17. 17. 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 ?呢
  18. 18. 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
  19. 19. 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 重點:判斷空字串的方式
  20. 20. Bash Script 的輸出入處理 #!/bin/bash ls -lR /usr > /tmp/usr.list 2>&1 RET=$? if [ $RET -ne 0 ]; then echo "ls failed." fi 重點: >, >&, $? $?: 前一次執行 的傳回值
  21. 21. 導向符號 ● > : 將標準輸出 (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
  22. 22. Exercise 3 ● 用 wget 抓取以下 案,並判斷是否成功。檔 – ftp://goodhorse.idv.tw/tetris.sh ● 提示: – wget, $? – man wget
  23. 23. 參考答案 3 #!/bin/bash wget ftp://goodhorse.idv.tw/tetris.sh RET=$? if [ $RET -ne 0 ]; then echo "wget failed." fi
  24. 24. 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 來存取
  25. 25. 載入其他 案內容:檔 Source ● 可以將設定單獨拉出來,較容易維護。 ● source 的 alias: . – . /etc/default/locale
  26. 26. 再談談變數 #!/bin/bash declare -i NUM NUM=4*2 echo $NUM 重點: declare 雖然 bash 中的變數,根據官方說法 是沒有型態的,但還是可以透過 declare 將變數宣告成特定的型態。 -i: 整數, -a | -A : 陣列, -f : 函 式, … 等等。 用 +i 則將變數的整數型態取消(恢 復成字串)。
  27. 27. 與使用者互動 #!/bin/bash echo -n " 請輸入姓名: " read NAME echo "Hello, $NAME." 重點:用 read 讀取鍵盤輸入,並傳遞到變數。 注意 read 後面放的是變數名稱( NAME )而非參考( $NAME )
  28. 28. 與 Shell Script 搭配的常用工具 ● grep ● sed ● awk ● zenity / kdialog
  29. 29. grep ● 從輸出中找出符合正規表示式的行 – ps axw | grep ba.h – dmesg | grep eth0 ● 搭配 -r 可以遞迴搜尋 案中的文字檔 – grep -r bash * ● -v: 反向(濾掉文字)
  30. 30. awk ● 字串處理工具,可以將輸入的行分欄位印出。 – ps axw | awk ' { print $1 " " $5 }; ' ● 也可以加入一些簡單的判斷式。 – ps axw | awk ' { if ($1 >= 4000 && $1 <= 5000) {print $1 " " $5} } '
  31. 31. 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
  32. 32. zenity / kdialog ● 產生一個簡單的視窗,提供資訊 / 詢問動作 / 進度條 / 顯示警告、 錯誤 ... ● zenity : based on GTK+, kdialog: based on QT #!/bin/bash zenity --info --text "Bash script 課程即將完成。 " kdialog --yesno " 請問還滿意 ?嗎 " zenity --question 與 kdialog --yesno 等,對不同答案的傳回 會不同。值 可以使用 $? 來取得答案。
  33. 33. Exercise 4 ● 取出主機上目前所有的 IP address ● 提示: – ip addr – grep inet – awk
  34. 34. 參考答案 4 #!/bin/sh ip addr | grep inet | awk ' { print $2; }'
  35. 35. 其他應用 ● switch case ● alias ● array ● …...
  36. 36. 總結 ● Bash script 本身的語法不多,但跟工具組合起來 之後就變化多端。 ● 一些進階的語法、用法不用強記,需要用的時候 可以去 。查 ● 瞭解更多工具的用法,讓 script 更強大。
  37. 37. 實用範例 1: 每日備份 ● 使用變數紀錄日期、時間,並決定 名檔 ● 執行壓縮 #!/bin/bash FILENAME=/opt/backup/ezgo_`date +%m%d`.tar.gz tar cfpvz ${FILENAME} /home/ezgo
  38. 38. 實用範例 2: 檢 硬 空間查 碟 ● 結合 df, grep, tr, awk 等工具 – df | grep -v ' 案系統檔 ' | tr -d '%' | awk ' { if ( $5 >= 80) { print $1 " " $5 " " $6 }} '
  39. 39. 實用範例 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
  40. 40. 點歌時間 ● 大家一起來做做看!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×