函數及腳本的綜合應用linux
一 shell函數shell
shell函數:shell容許將一組命令集或語句造成一個可用塊,這些塊稱爲shell函數bash
函數由兩部分組成:函數標題、函數體;標題是函數名;函數體是函數內的命令集合;標題名應該惟一;若是不是,將會混淆結果,由於腳本在查看調用腳本前將首先搜索函數調用相應的shell。ide
定義函數的格式爲:函數
函數名(){測試
命令1this
...spa
}日誌
若是願意,可在函數名前加上關鍵字function,這取決於使用者。blog
function函數名()
{
命令1
...
}
二 應用
例1:刪除文件中的空行
這個腳本(腳本名爲del.lines)能夠處理一個或多個文件。每一個文件在用sed刪除空行以前要先覈實是否存在。
sed的輸出被導入一個文件名中含有$ $的臨時文件,最後這個臨時文件又被移回到原來的文件中。
該腳本使用shift命令取得全部的文件名,用while循環逐個處理全部的文件,直至處理完爲止。可使用del.lines --help得到一個簡短的幫助
#!/bin/bash
TEMP_F="/tmp/del.lines.$$"
#定義函數
usage()
{
#提示腳本運行格式並查看幫助信息
}
#若是腳本後面的參數個數爲0,即沒有參數
if [ $# -eq 0 ]
then
#則提示函數裏的內容
fi
while [ $# -gt 0 ]
do
#提示正在執行的是位置1的參數
#若是位置1的參數時--help,則顯示幫助信息
#判斷位置1的文件是否存在
#刪除源文件內的空行(不是空格鍵的空行),並生成新的文件
#將 $1~$9 依次向左傳遞
done
保存後給腳本文件增長執行權限:chmod +x del.lines
執行腳本進行測試:
注:
一、basename命令可以從路徑中分離出文件名。一般用於shell腳本中
二、shift語句用於遷移位置變量,將 $1~$9 依次向左傳遞
例如,若當前腳本程序得到的位置變量以下:
$1=file一、$2=file二、$3=file三、$4=file4
則執行一次shift命令後,各位置變量爲:
$1=file二、$2=file三、$3=file4
再次執行shift命令後,各位置變量爲:
$1=file三、$2=file4
例2:若是某些日誌文件超過了特定的長度(如8K),那麼它的內容將被倒換到另外一個文件中,並清除原有文件中的內容.
系統中的有些日誌文件增加十分迅速,天天手工檢查這些日誌文件的長度並倒換這些日誌文件(一般是給文件名加個時間戳)是很是乏味的。能夠編寫一個腳原本自動完成這項工做。該腳本將提交給cron進程來運行,若是某個日誌文件超過了特定的長度,那麼它的內容將被倒換到另外一個文件中,並清除原有文件中的內容。
該腳本中日誌文件的長度限制是由變量BLOCK_LIMIT設定的。這一數字表明瞭塊數目,在本例中是8(塊大小默認爲4K)。能夠按照本身的需求把這一數字設得更高。全部要檢查的日誌文件名都保存在變量LOGS中。
這裏使用了一個for循環來依次檢查每個日誌文件,使用du命令來獲取日誌文件長度。
若是相應的文件長度大於BLOCK_LIMIT變量所規定的值,那麼該文件將被拷貝到一個文件
名含有時間戳的文件中,原先的文件長度將被截斷爲0。
#!/bin/bash
BLOCK_LIMIT=8
MYDATE=$(date +%d%m)
#定義文件列表集合
LOGS="/var/log/maillog /var/log/messages"
for LOG_FILE in $LOGS
do
#文件不存在,直接不用執行下面的語句從新開始循環
#清空原來的文件內容
done
注:du 並非顯示文件的實際大小,而是顯示文件所佔用的 block 大小,默認linux系統分區的 block size 是4k,也就是說即便文件只有1個字節,也會佔用4k. ls -l則是文件的實際大小