script programming @hackingcamp 2011
TRANSCRIPT
Script ProgrammingLinux Power User 的利器
陳信屹 (Hychen)
HackingCamp 2011, 大溪國小
本簡報圖檔下載於網際網路者,特別聲明為自由軟體推廣演講中進行「合理使用」,請讀者不要任意移置他用。
本簡報採用 創用CC「姓名標示-非商業性」3.0 台灣條款
Hychen
● 現為 Canonical 軟體工程師● Canonical 為 Ubuntu GNU/Linux 的主要商業贊助商
● 曾為 Lazyscripts Project 開發人員● 架構設計 , 程式開發
● 大一開始接觸 Linux, Linux 使用經驗 9 年
● http://about.me/hychen
開始之前 ...
很難 ?Power User 才會 ???
Script
我也不是一開始就是
Linux Power User 的!
Picture:http://www.flickr.com/photos/55524309@N05/5519745603/sizes/z/in/photostream/
何時用 ?處理任何可以自動化的事時
Script
少做多玩
是什麼 ?將許多指令彙整寫在一起,處理複雜的動作。
Script
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
指令 ???
去買中餐
去繳信用卡帳單
買 LV 包包送我
回家後洗衣服 , 丟垃圾
指令
托人買 iPAD2
怎麼下指令 ??
I don't care
幫我買白色的 ipad2 ( 單一指令 )
如果沒有白色的 32G, 就買白色 64G, 否則就買黑色 32G ( 條件式指令 )
在買到以前 , 每天都幫我去商店看有沒有現貨 ( 重複指令 )
幫我買白色的 ipad2 ( 單一指令 )
如果沒有白色的 32G, 就買白色 64G, 否則就買黑色 32G ( 條件式指令 )
在買到以前 , 每天都幫我去商店看有沒有現貨 ( 重複指令 )
函數 ?拖人買 iPad2 {
}
幫我買 A___ ( 單一指令 )
如果沒有 A___, 就買白色 64G, 否則就買黑色 32G ( 條件式指令 )
在買到以前 , 每天都幫我去商店看有沒有現貨 ( 重複指令 )
變數 ?拖人買 A___ {
}
Script?指令 變數
迴圈 函數 條件式
君有令電腦
不敢不從
rm -rf /NEVER DO THIS!
Terminal 是power User 的好朋友 !!
指令不會問男人user@host$ man cmd
你好世界First Example
GNU Bash
Bash is the shell, or command language interpreter, that will
appear in the GNU operating system.
Shell 也是一種使用者介面 , 只是沒圖形化介面那麼華麗罷了
Perl Python
編輯器有差嗎 ? 當然有差
好的編輯器帶你上天堂爛的編輯器帶你住套房
By c9s
Gedit編輯器
VIM編輯器之神
VIM Hacks – c9shttp://www.slideshare.net/c9s/vim-hacks
Emacs神之編輯器
a.k.a 偽裝成編輯器的作業系統
./script.sh
bash script.sh
source script.sh
變數
字串
name='hychen'
直接賦值
name=`whoami`
賦值指令結果
一個空格的慘劇rm /usr /share/application/example
$name ${name}
取得變數的值
數字
X=1
直接賦值
$((1+1))
數字運算
$((X+1))
數字運算
陣列
X=(1 2 3)
允許數字字串混用
以空白隔開
Index由 0開始
X[0]=4
設定第 1個元素
X[1]=4
設定第 2個元素
[1]的 1可被替換成任意數字
${X[0]}
取得第 1個元素
${X[1]}
取得第 2個元素
[1]的 1可被替換成任意數字
X=(1 2 3)
${X[3]}
注意邊界問題 !
Wrong
${VAR/str1}${VAR#}
${VAR##}${VAR%}
${VAR%%}${VAR/str1/str2}
輸入
$0 檔名./script 1 2 3 4 #!/bin/sh
echo $0 # script
$N 第 N 個參數./script 1 2 A 4 #!/bin/sh
echo $1 # 1
echo $3 # A
$# 參數個數./script 1 2 A 4 #!/bin/sh
echo $# # 4
$@ 所有參數./script 1 2 A 4 #!/bin/sh
Echo $@ # '1 2 3 4'
字串
< 標準輸入導向
./script < input_file.txt
輸出
| PIPE / 管線
dpkg -l | grep vim
dpkg -l | grep vim | grep tiny
> 標準輸出導向 ( 覆蓋 )
echo Hello > test.txt
echo World > test.txt
HelloHello
World
>> 標準輸出導向 ( 添加 )
echo Hello > test.txt
echo World >> test.txt
Hello
HelloWorld
2> 錯誤輸出導向
SKIP: 有興趣的人自己研究
環境變數
$PATH $PWD $HOME可執行指令位置 現在位置 家目錄
判斷符號
[ -z $HOME ]; echo $?
$? 程式執行結果狀態
[ -z $HOME ] && echo 'empty'
$?! == 1 則執行第二個指令
[ -z $HOME ] || echo 'exist'
$? != 0 則執行第二個指令
在 []內每個元素都需要有空白鍵來分隔;變數,最好都以雙引號括號起來;
常數,最好都以單或雙引號括號起來。
條件式
If 判斷符號 ;then codefi
If [ -z $HOME ];then echo 'empty'fi
If 判斷符號 ;then codeelse codefi
If 判斷符號 ;then codeelse codefi
If [ -z $HOME ] [ 1 == 1 ];then echo 'empty'else echo 'exist'fi
&&
||
&& - AND
|| - OR
case $VAR in ' 第一個內容 ') code ;; ' 第二個內容 ') code ;; *) code ;;esac
for var in $i;do echo $vardone
for(( 初始值 ; 限制值 ; 執行步階 ))do
codedone
while 判斷符號do codedone
until 判斷符號do codedone
function 函數名 { echo $1 $ 2 $3}
Bash 的變數沒有 Scope
正規表示式
^.*\w+\d+$
^ 行頭
. 任意字元
* 多次符合( 包含 0 次 )
+ 多次符合( 至少一次 )
\w 字串
\d 數字
$ 行尾
很多地方都會用到
Sed , awk
POSIX,PERL, C REGEX
Thanks