script programming @hackingcamp 2011

92
Script Programming Linux Power User 的利器 陳信屹 (Hychen) HackingCamp 2011, 大溪國小 本簡報圖檔下載於網際網路者,特別聲明為自由軟體推廣演講中進行「合理使用」,請讀者不要任意移置他用。 本簡報採用 創用 CC 「姓名標示 - 非商業性」 3.0 台灣條款

Upload: hsinyi-chen

Post on 14-May-2015

1.178 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Script Programming @HackingCamp 2011

Script ProgrammingLinux Power User 的利器

陳信屹 (Hychen)

HackingCamp 2011, 大溪國小

本簡報圖檔下載於網際網路者,特別聲明為自由軟體推廣演講中進行「合理使用」,請讀者不要任意移置他用。

本簡報採用 創用CC「姓名標示-非商業性」3.0 台灣條款

Page 2: Script Programming @HackingCamp 2011

Hychen

● 現為 Canonical 軟體工程師● Canonical 為 Ubuntu GNU/Linux 的主要商業贊助商

● 曾為 Lazyscripts Project 開發人員● 架構設計 , 程式開發

● 大一開始接觸 Linux, Linux 使用經驗 9 年

● http://about.me/hychen

Page 3: Script Programming @HackingCamp 2011

開始之前 ...

Page 4: Script Programming @HackingCamp 2011

很難 ?Power User 才會 ???

Script

Page 5: Script Programming @HackingCamp 2011

我也不是一開始就是

Linux Power User 的!

Picture:http://www.flickr.com/photos/55524309@N05/5519745603/sizes/z/in/photostream/

Page 6: Script Programming @HackingCamp 2011

何時用 ?處理任何可以自動化的事時

Script

Page 7: Script Programming @HackingCamp 2011

少做多玩

Page 8: Script Programming @HackingCamp 2011

是什麼 ?將許多指令彙整寫在一起,處理複雜的動作。

Script

Page 9: Script Programming @HackingCamp 2011

cp ls mv grep awk mkdir rm top ps cat wc echo

who bzr git apt-get apt-cache apt-file

cut wget tee pstree dmesg lspcilsusb aticonfig reportbug gpg

mount df du fdisk

指令 ???

Page 10: Script Programming @HackingCamp 2011

去買中餐

去繳信用卡帳單

買 LV 包包送我

回家後洗衣服 , 丟垃圾

指令

Page 11: Script Programming @HackingCamp 2011

托人買 iPAD2

怎麼下指令 ??

Page 12: Script Programming @HackingCamp 2011

I don't care

Page 13: Script Programming @HackingCamp 2011

幫我買白色的 ipad2 ( 單一指令 )

如果沒有白色的 32G, 就買白色 64G, 否則就買黑色 32G ( 條件式指令 )

在買到以前 , 每天都幫我去商店看有沒有現貨 ( 重複指令 )

Page 14: Script Programming @HackingCamp 2011

幫我買白色的 ipad2 ( 單一指令 )

如果沒有白色的 32G, 就買白色 64G, 否則就買黑色 32G ( 條件式指令 )

在買到以前 , 每天都幫我去商店看有沒有現貨 ( 重複指令 )

函數 ?拖人買 iPad2 {

}

Page 15: Script Programming @HackingCamp 2011

幫我買 A___ ( 單一指令 )

如果沒有 A___, 就買白色 64G, 否則就買黑色 32G ( 條件式指令 )

在買到以前 , 每天都幫我去商店看有沒有現貨 ( 重複指令 )

變數 ?拖人買 A___ {

}

Page 16: Script Programming @HackingCamp 2011

Script?指令 變數

迴圈 函數 條件式

Page 17: Script Programming @HackingCamp 2011

君有令電腦

不敢不從

Page 18: Script Programming @HackingCamp 2011

rm -rf /NEVER DO THIS!

Page 19: Script Programming @HackingCamp 2011

Terminal 是power User 的好朋友 !!

Page 20: Script Programming @HackingCamp 2011

指令不會問男人user@host$ man cmd

Page 21: Script Programming @HackingCamp 2011

你好世界First Example

Page 22: Script Programming @HackingCamp 2011

GNU Bash

Bash is the shell, or command language interpreter, that will

appear in the GNU operating system.

Shell 也是一種使用者介面 , 只是沒圖形化介面那麼華麗罷了

Page 23: Script Programming @HackingCamp 2011

Perl Python

Page 24: Script Programming @HackingCamp 2011

編輯器有差嗎 ? 當然有差

Page 25: Script Programming @HackingCamp 2011

好的編輯器帶你上天堂爛的編輯器帶你住套房

By c9s

Page 26: Script Programming @HackingCamp 2011

Gedit編輯器

Page 27: Script Programming @HackingCamp 2011

VIM編輯器之神

Page 28: Script Programming @HackingCamp 2011

VIM Hacks – c9shttp://www.slideshare.net/c9s/vim-hacks

Page 29: Script Programming @HackingCamp 2011

Emacs神之編輯器

a.k.a 偽裝成編輯器的作業系統

Page 30: Script Programming @HackingCamp 2011

./script.sh

bash script.sh

source script.sh

Page 31: Script Programming @HackingCamp 2011

變數

Page 32: Script Programming @HackingCamp 2011

字串

Page 33: Script Programming @HackingCamp 2011

name='hychen'

直接賦值

Page 34: Script Programming @HackingCamp 2011

name=`whoami`

賦值指令結果

Page 35: Script Programming @HackingCamp 2011

一個空格的慘劇rm /usr /share/application/example

Page 36: Script Programming @HackingCamp 2011

$name ${name}

取得變數的值

Page 37: Script Programming @HackingCamp 2011

數字

Page 38: Script Programming @HackingCamp 2011

X=1

直接賦值

Page 39: Script Programming @HackingCamp 2011

$((1+1))

數字運算

Page 40: Script Programming @HackingCamp 2011

$((X+1))

數字運算

Page 41: Script Programming @HackingCamp 2011

陣列

Page 42: Script Programming @HackingCamp 2011

X=(1 2 3)

允許數字字串混用

以空白隔開

Index由 0開始

Page 43: Script Programming @HackingCamp 2011

X[0]=4

設定第 1個元素

Page 44: Script Programming @HackingCamp 2011

X[1]=4

設定第 2個元素

[1]的 1可被替換成任意數字

Page 45: Script Programming @HackingCamp 2011

${X[0]}

取得第 1個元素

Page 46: Script Programming @HackingCamp 2011

${X[1]}

取得第 2個元素

[1]的 1可被替換成任意數字

Page 47: Script Programming @HackingCamp 2011

X=(1 2 3)

${X[3]}

注意邊界問題 !

Wrong

Page 48: Script Programming @HackingCamp 2011

${VAR/str1}${VAR#}

${VAR##}${VAR%}

${VAR%%}${VAR/str1/str2}

Page 49: Script Programming @HackingCamp 2011

輸入

Page 50: Script Programming @HackingCamp 2011

$0 檔名./script 1 2 3 4 #!/bin/sh

echo $0 # script

Page 51: Script Programming @HackingCamp 2011

$N 第 N 個參數./script 1 2 A 4 #!/bin/sh

echo $1 # 1

echo $3 # A

Page 52: Script Programming @HackingCamp 2011

$# 參數個數./script 1 2 A 4 #!/bin/sh

echo $# # 4

Page 53: Script Programming @HackingCamp 2011

$@ 所有參數./script 1 2 A 4 #!/bin/sh

Echo $@ # '1 2 3 4'

字串

Page 54: Script Programming @HackingCamp 2011

< 標準輸入導向

./script < input_file.txt

Page 55: Script Programming @HackingCamp 2011

輸出

Page 56: Script Programming @HackingCamp 2011

| PIPE / 管線

dpkg -l | grep vim

dpkg -l | grep vim | grep tiny

Page 57: Script Programming @HackingCamp 2011

> 標準輸出導向 ( 覆蓋 )

echo Hello > test.txt

echo World > test.txt

HelloHello

World

Page 58: Script Programming @HackingCamp 2011

>> 標準輸出導向 ( 添加 )

echo Hello > test.txt

echo World >> test.txt

Hello

HelloWorld

Page 59: Script Programming @HackingCamp 2011

2> 錯誤輸出導向

SKIP: 有興趣的人自己研究

Page 60: Script Programming @HackingCamp 2011

環境變數

Page 61: Script Programming @HackingCamp 2011

$PATH $PWD $HOME可執行指令位置 現在位置 家目錄

Page 62: Script Programming @HackingCamp 2011

判斷符號

Page 63: Script Programming @HackingCamp 2011

[ -z $HOME ]; echo $?

$? 程式執行結果狀態

Page 64: Script Programming @HackingCamp 2011

[ -z $HOME ] && echo 'empty'

$?! == 1 則執行第二個指令

Page 65: Script Programming @HackingCamp 2011

[ -z $HOME ] || echo 'exist'

$? != 0 則執行第二個指令

Page 66: Script Programming @HackingCamp 2011

在 []內每個元素都需要有空白鍵來分隔;變數,最好都以雙引號括號起來;

常數,最好都以單或雙引號括號起來。

Page 67: Script Programming @HackingCamp 2011

條件式

Page 68: Script Programming @HackingCamp 2011

If 判斷符號 ;then codefi

Page 69: Script Programming @HackingCamp 2011

If [ -z $HOME ];then echo 'empty'fi

Page 70: Script Programming @HackingCamp 2011

If 判斷符號 ;then codeelse codefi

Page 71: Script Programming @HackingCamp 2011

If 判斷符號 ;then codeelse codefi

Page 72: Script Programming @HackingCamp 2011

If [ -z $HOME ] [ 1 == 1 ];then echo 'empty'else echo 'exist'fi

&&

||

&& - AND

|| - OR

Page 73: Script Programming @HackingCamp 2011

case $VAR in ' 第一個內容 ') code ;; ' 第二個內容 ') code ;; *) code ;;esac

Page 74: Script Programming @HackingCamp 2011

for var in $i;do echo $vardone

Page 75: Script Programming @HackingCamp 2011

for(( 初始值 ; 限制值 ; 執行步階 ))do

codedone

Page 76: Script Programming @HackingCamp 2011

while 判斷符號do codedone

Page 77: Script Programming @HackingCamp 2011

until 判斷符號do codedone

Page 78: Script Programming @HackingCamp 2011

function 函數名 { echo $1 $ 2 $3}

Page 79: Script Programming @HackingCamp 2011

Bash 的變數沒有 Scope

Page 80: Script Programming @HackingCamp 2011

正規表示式

Page 81: Script Programming @HackingCamp 2011

^.*\w+\d+$

Page 82: Script Programming @HackingCamp 2011

^ 行頭

Page 83: Script Programming @HackingCamp 2011

. 任意字元

Page 84: Script Programming @HackingCamp 2011

* 多次符合( 包含 0 次 )

Page 85: Script Programming @HackingCamp 2011

+ 多次符合( 至少一次 )

Page 86: Script Programming @HackingCamp 2011

\w 字串

Page 87: Script Programming @HackingCamp 2011

\d 數字

Page 88: Script Programming @HackingCamp 2011

$ 行尾

Page 89: Script Programming @HackingCamp 2011

很多地方都會用到

Page 90: Script Programming @HackingCamp 2011

Sed , awk

Page 91: Script Programming @HackingCamp 2011

POSIX,PERL, C REGEX

Page 92: Script Programming @HackingCamp 2011

Thanks