深入了解bash shell script
深入了解bash shell script
前言
相信所有玩過 Unix的人都會同意 shell script 是一個十分強大的工具,可以用來幫助自已在短時間內解決許多枯\躁而乏味的工作,而且讓工作變得有趣。
寫 script 之前,要先了解:
1. 資料流
- >、>>、<、| , #&># .....
2. 一些好用的指令
3. 變數
4. 運算式
5. 判斷式
6. 迴圈
7.函式
參考 : 如何撰寫Shell Script
資料流
- 0. stdin
- 1. stdout
- 2. stderr
這三個檔案分別是 資料流的 輸入和輸出,及錯誤輸出。在 default 之下,stdin 是接著 keyboard,stdout 是接著 tty (你想成 monitor 就好了),stderr 也是接著 tty
- $cat < test.txt
- ">" 是把 stdout 寫入後面的 file。
- 如檔案內有東西,會把檔案內的東西清空才寫入。
">>" 和 ">" 相同,但不會把檔案內的東西清空,而是寫在檔尾,如:
- $cat test.txt >> foo
- cat test.txt | more
- 這樣, cat 的輸出就可以被 more 接下來。
>, >> 還可以把 stderr 轉到 stdout,如:
- 2>&1
- 也可把 stdout 轉到 stderr,如:1>>&2
- cat pbsd.c | grep CONFIG_PBS
善用工具
下面是一些工具的簡單介紹。(都可用 pipe 和轉向)
cat : concatenate,把檔案打開,印到 stdout 上。
RegExp Regular Expression 正則表達式。
grep :globally search a regular expression and print,以正則表達式進行全域尋找以及列印
- $grep "I Love Shell Script" test.txt
- 就是把 test.txt 這個檔案中,有 "I Love Shell Script" 這個字串的那一行印>到stdout 中。
- $cat test.txt | grep "I Love Shell Script" #也是一樣的
awk: 全稱為"Aho Weiberger and Kernighan"三個作者的性的第一個字母。
- $awk '{print NR,$0}' text.txt
- 就會把 text.txt 的內容印出來,且加上行數,
sed:
find:
這個工具可以依你的要求,找出你想要的檔案,在系統管理上很好用。可依時間,大小,檔名,修改時間等等的選項來找檔案。
more (less) :
man find :
- 然後你就會了解為什麼我只說一下它們的功能了。
變數
- myvar="I love linux." ,就是指定 myvar 這個變數為 "I love linux." 這個字串。
- 使用這個變數呢,則是用 $myvar 來使用,如: echo $myvar
如想對 變數做運算,可用 let :
- let "expression", 如: let i=i+1
參數
在 shell script 中,可以在 script 加上參數,而參數會依你所打入的指令依序定義,如有一個script 叫 showme
#!/bin/bash # filename showme echo $0 echo $1 echo $2
執行結果如下
>./showme abc def > ./showme abc def
寫著寫著,有一些東西不清楚,找了一下 man,發現 man 寫得真是清楚極了。
在 bash 之中 我們可以用 ` command` 來執行指令,且將其視為一個整體,最後的結果為全部的結果,例如:
- ls -alF `find -size 0`
- NumberOfFiles=`find | wc -l`
Shell Script 完整的表達式
判斷式
- if expression; then
- list
- elif list; then
- list
- else
- list
- fi
這裏的 list 代表是一個或一堆指令的集合。expression 代表的是一個會有return 值的指令。
- 如expression 不為空,或 0 就表示為 true
- fi 代表 這個 if 結束了 如同 C 語言的 }
- then 就如同 C 語言的 {
- elif 後面的 list 會依序執行,到了最後如不為空,或 0 就為真 也就是再執行後面的 list
對於 expression 如要寫判斷式 有兩種格式
1. ((表達式))
- (( $abc + 1 ))
2. [[表達式]]
- [[ $1 == "abc" ]]
比較的運算子有 == != ! && ||
- == 是全等
- != 不等
- ! not 運算子
- && and 運算子
- || or 運算子
範例
if (( $#==0 )) ; then
echo "usage: xxx [xxx | xxxx]"
else
if ( [[ $1 != "xxx" ]] && [[ $1 != "xxxx" ]] ) ; then
echo "prometer [xxx | xxxx]"
exit
fi
if [ $1 = "xxx" ]; then
.............
else
................
fi
fi
for 和 while
for : 在bash 中 for 的用法有兩種
- for name [ in word ] ; do list ; done
- for (( expr1 ; expr2 ; expr3 )) ; do list ; done
第二種就很像 C 語言了, 第一次跑時,一開始 run expr1,再check expr2,跑完 list 後 跑 expr3 再跑 expr2,一旦expr2 的結果是 0 or 空 就跳離。
while : while 的用法
- while list_a ; do list_b; done
當 list_a 的最後一個 command 結果不為 0 或 空之時,就進入迴圈做 list_b
until:
- until list_a; do list_b; done
還有一些東西 如 select case esac 等... 這些東西可以用 if for or while 組合而成,就不再說明了。
開始來寫寫 bash shell script 吧
- 1. bash chout
- 這個方法是執行一個 bash ,且叫它讀入 chout 並執行
- 2. 在chout 的第一行加入#!/bin/bash
- (告訴你的shell 這個 shell script 指定用 bash)
讓我們來看看這個例子
01 #!/bin/bash02 if (( $#==1 )) ; then03 ares=`find -name '*.c'`04 ares="$ares `find -name '*.h'`"05 else06 ares=`find -name $2`07 fi08 for arrs in $ares09 do10 if [ -f $arrs ] && (( `cat $arrs | grep -i $1 | wc -l` > 0 )); then11 echo "In file $arrs"12 cat $arrs | awk '{print "#"NR"\t"$0}' | grep -i $113 echo " "14 fi15 done
讓我們在看個例子
#!/bin/bash for file in * do echo $file done
- * 是shell default的符號,它表示一個array存放所有的檔名資料,for 會將array中的資料一筆一筆的丟進file變數中,直到file為空,才跳出回圈。
- $ 將file變數中的值取出
參考資料
特色、摘要,Feature、Summary:
關鍵字、標籤,Keyword、Tag:
- Ubuntu,Shell Script,Shell,Linux,
留言
張貼留言
Aron阿龍,謝謝您的留言互動!