目錄
command line
function
command line
command options arguments
options ,執行任務的方式 ,控制命令的動作,選項也稱開關switches或者標誌flags
arguments ,指定命令使用的數據
空白符,使用空格和製表符作爲分隔符的思想,是如此的重要,所以他們有自己的名稱,空白符
space 製表符,新行字符(Carriage Return回車符)
[root@localhost script]# set |grep IFS
IFS=$' \t\n'
\n newline 新行字符
\r return 回車符
\t tab 製表符
使用者每輸入一個鍵,cursor 就往後移動一格,直到碰到命令行讀進 CR(Carriage Return,由 Enter 鍵產生)字符爲止
所謂的命令行,就是在 shell prompt 與 CR 字符之間所輸入的文字。
若從技術細節來看,shell 會依據 IFS(Internal Field Seperator) 將 command line 所輸入的文字給拆解爲"字段"(word)。
然後再針對特殊字符(meta)先作處理,最後再重組整行 command line 。
其中的 IFS 是 shell 預設使用的字段分隔符,可以由一個及多個如下按鍵組成:
* 空格鍵(White Space)
* 表格鍵(Tab)
* 回車鍵(Enter)
系統可接受的命令名稱(command-name)可以從如下途徑獲得:
* 明確路徑所指定的外部命令
* 命令別名(alias)
* 自定功能(function)
* shell 內建命令(built-in)
* $PATH 之下的外部命令
每一個命令行均必需含用命令名稱,這是不能缺少的。
簡單而言(我不敢說這是精確的定議,注一),command line 的每一個 charactor ,分爲如下兩種:
* literal:也就是普通純文字,對 shell 來說沒特殊功能。
* meta:對 shell 來說,具有特定功能的特殊保留字符。
IFS space,tab,enter
CR carriage return
= $ >等
IFS 是用來拆解 command line 的每一個詞(word)用的,因爲 shell command line 是按詞來處理的。
而 CR 則是用來結束 command line 用的,這也是爲何我們敲 ; 命令就會跑的原因。
function
所有函數在使用前必須定義。這意味着必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,纔可以使用。調用函數僅使用其函數名即可。可以將函數看作是腳本中的一段代碼,但是有一個主要區別。執行函數時,它保留當前shelll和內存信息。如果執行或調用一個腳本文件中的另一段代碼,將創建一個單獨的shell,因而去除所有原腳本中定義的存在變量。
函數可以放在同一個文件中作爲一段代碼,也可以放在只包含函數的單獨文件中。
格式兩種
function(這個關鍵字可以不要) func_name(){
#函數體內容
}
func_name(){
#函數體內容
}
函數調用:func_name parm
函數體中,可以通過$1 $2 ...$9接受函數調用中的變量
函數可以通過return 返回函數執行的結果
1、在/home/script/目錄下新建函數文件fun-1
2、在fun-1文件中編寫函數findit內容
#!/bin/bash
findid ()
{
if [ $# -lt 1 ]; then #判斷函數參數個數
echo "usage: findit filename";
return 1;
fi;
for loop in "$@"; #遍歷調用函數的參數
do
find /home/script/ -name $loop -print;
done;
return 0
}
3、Shell中載入函數文件
.或source /home/script/fun-1
4、檢查載入文件
set
set命令將在shell中顯示所有的載入函數
5、調用函數
findit mysql php #在home目錄查找文件mysql和文件php
當你收集一些經常使用的函數時,可以將之放入函數文件中並將文件載入s h e l l。
文件頭應包含語句#!/bin/sh,文件名可任意選取,但最好與相關任務有某種實際聯繫。
一旦文件載入shell,就可以在命令行或腳本中調用函數。可以使用set命令查看所有定義
的函數。輸出列表包括已經載入shell的所有函數。
如果要改動函數,首先用unset命令從shell中刪除函數,儘管unset刪除了函數以便於此函數對於shell或腳本不可利用,但並不是真正的刪除。
改動完畢後,再重新載入此文件。有些shell會識別改動,不必使用unset命令,但爲了安全起見,改動函數時最好使用unset命令。
調用
同一個腳本中調用函數,只需要在調用前定義即可。
從函數文件中調用函數,這種方法不會創建另一個shell,所有函數均在當前shell下執行。
調用腳本在調用前需要載入函數文件。
/etc/sysconfig/ 每一種服務的變量定義
/etc/init.d 每一種服務的腳本
/etc/init.d/funtions 函數文件擁有所有的公用函數