myport(){
for i
do
lsof -i:$i |tail -n +2 |tr -s ' ' |cut -d ' ' -f1,8 |sort |uniq >port
if ` -s port `
then
while read ser pro
do
echo $ser is listening : $pro $i port
done<port
else
echo $i port is not listening
fi
done
}
myport $@
效果:

分析:
tail的使用 -n +2 是從第2行開始顯示
tr(translate縮寫)主要用于删除檔案中的控制字元,或進行字元轉換。
文法:tr [–c/d/s/t] [SET1] [SET2]
SET1: 字元集1
SET2:字元集2
-c:complement,用SET2替換SET1中沒有包含的字元
-d:delete,删除SET1中所有的字元,不轉換
-s: squeeze-repeats,壓縮SET1中重複的字元
-t: truncate-set1,将SET1用SET2轉換,一般預設為-t
去除重複的字元:tr -s set1
删除空白行
删除空白行就是删除換行符/n
注意:這些空白行上隻有回車符,沒有空格符
這裡用換行符的轉義字元\n
注意:用-s删除了多餘的換行符,如果用-d,則會删除所有的換行符
cut的使用
cut指令主要是接受三個定位方法:
第一,位元組(bytes),用選項-b
第二,字元(characters),用選項-c
第三,域(fields),用選項-f
-b支援形如3-5的寫法,而且多個定位之間用逗号隔開就成
但有一點要注意,cut指令如果使用了-b選項,那麼執行此指令時,cut會先把-b後面所有的定位進行從小到大排序,然後再提取。可不能颠倒定位的順序哦
-3表示從第一個位元組到第三個位元組,而3-表示從第三個位元組到行尾。如果你細心,你可以看到這兩種情況下,都包括了第三個位元組“c”。
如果我執行who|cut -b -3,3-,你覺得會如何呢?答案是輸出整行,不會出現連續兩個重疊的c的
如果你觀察過/etc/passwd檔案,你會發現,它并不像who的輸出資訊那樣具有固定格式,而是比較零散的排放。但是,冒号在這個檔案的每一行中都起到了非常重要的作用,冒号用來隔開每一個項。
我們很幸運,cut指令提供了這樣的提取方式,具體的說就是設定“間隔符”,再設定“提取第幾個域”,就OK了!
注意從檔案裡讀取資料的使用
函數的使用
函數必須先定義再使用,這個錯誤一般不會出現
調用函數
調用已定義的函數,直接用函數名
可以向函數内傳遞參數(可以使用位置參數)示例:函數名 參數1 參數2 ...
運作腳本時寫位置參數,調用函數時要用$@