入職這段時間大量使用shell,有一些零散的點,記在這裡備忘。
一 shell種的if
shell中的if與c中的if用法有很大區別,一般是結合[ ]使用(目前我只這麼用過:>),例如if [ $a -eq 0 ]; then do ... done。中括弧實際上起真正的判斷作用,需要特別注意的是,[和]兩邊都需要有空格。
[]中,與數字比較時,有以下幾種關係操作符:
-eq 相等
-ne 不相等
-gt 大於
-ge 大於等於
-lt 小於
-le 小於等於
與字串比較時,有以下操作符:
= 等於
!= 不等於
注意:關係操作符兩邊都要加空格。
二 shell中的迴圈
for迴圈有以下幾種使用方法:
1
for file in $(ls); do
echo $file
done
$(ls)是把ls當做命令執行,輸出結果當做數組的值,數組的每個元素是按空白符分開的。
2 類似c語言的用法
for ((i=0; i<10; i++)); do
echo $i
done
(())中的變數可以不加$,在這裡與c語言一樣。
3
for i in 0 1 2 3; do
echo $i
done
4
for i in {1..3}; do
echo $i
done
while迴圈的用法:
while 條件運算式; do
迴圈體
done
條件運算式可以有許多形式,如for迴圈種(())的類似c語言的方法,還可以是if中類似的條件陳述式。
三 awk
在日誌分析時,awk和sed是最常用的命令,這裡簡單介紹一下。
1 基本方法:awk -F”分隔字元” ‘BEGIN{}condition_1{}condition_2{}END{}’ input_file_1 input_file_2
2 BEGIN{}和END{}是可選的,其實BEGIN和END也相當於特殊的condition。BEGIN{}是awk啟動時先執行的操作,其中的語句會在輸入檔案被處理之前執行,裡面一般是一些初始化操作。END{}是所有輸入檔案處理完之後執行的部分,在統計類的應用中常用。
3 condition是在處理輸入的每行之前檢查的條件,如果符合條件,才執行後面花括弧中的語句。condition可以是==、>、<之類的條件陳述式,也可以使用Regex,如var~/abc/表示變數var匹配//中的Regex。
4 awk中有一些內建的變數,如$n表示正在處理的一行中的第n個欄位(欄位是以-F後面的分隔字元分的),欄位從1開始算起。$0表示整行。ARGIND表示第幾個輸入檔案(mac系統下貌似有問題),NF表示當前行的欄位個數,NR表示當前處理的行數。
5 condition之間(包括BEGIN和END)沒有先後順序,可以把END{}寫在BEGIN{}前面。
6 最後面是輸入檔案,可以有多個,awk會按檔案名稱的順序處理輸入檔案。
四 函數
最後說一下shell的函數,函數的聲明方式為:
function foo()
{
x=$1
...
}
調用方法:foo argv
函數可以接受參數,在函數中通過$1,$2來使用參數
注意:shell中,函數中的變數是全域變數!