Linux Shell 用法(一)7.函數和參數

函數和參數

函數的定義包括function命令、函數名、開/閉括號以及包含在一對花括號中的函數體。
(1) 函數可以這樣定義:
function fname()
{
statements;
}
或者
fname() {
statements;
}
甚至是這樣(對於簡單的函數):
fname() { statement; }

(2) 只需使用函數名就可以調用函數:

$ fname ; #執行函數

(3) 函數參數可以按位置訪問,$1是第一個參數,$2是第二個參數,以此類推:

fname arg1 arg2 ; #傳遞參數

以下是函數fname的定義。在函數fname中,包含了各種訪問函數參數的方法。

fname()
{
echo $1, $2;	#訪問參數1和參數2
echo "$@";		#以列表的方式一次性打印所有參數
echo "$*";		#類似於$@,但是所有參數被視爲單個實體			#返回值
return 0;
}

傳入腳本的參數可以通過下列形式訪問。


 $0是腳本名稱。
 $1是第一個參數。
 $2是第二個參數。
 $n是第n個參數。
 "$@"被擴展成"$1" "$2" "$3"等。
 "$*"被擴展成"$1c$2c$3",其中c是IFS的第一個字符。
 "$@"要比"$*"用得多。由於"$*"將所有的參數當作單個字符串,因此它很少被使用。

	

比較別名與函數
下面的這個別名通過將ls的輸出傳入grep來顯示文件子集。別名的參數添加到命令的尾 部,因此lsg txt就被擴展成了ls | grep txt:

  $> alias lsg='ls | grep'
  $> lsg txt
    file1.txt
    file2.txt
    file3.txt

如果想獲得/sbin/ifconfig文件中設備對應的IP地址,可以嘗試這樣做:

$> alias wontWork='/sbin/ifconfig | grep'
$> wontWork eth0

eth0 Link encap:Ethernet HWaddr 00:11::22::33::44:55

grep命令找到的是字符串eth0,而不是IP地址。如果我們使用函數來實現的話,可以將 5 設備名作爲參數傳入ifconfig,不再交給grep:

$> function getIP() { /sbin/ifconfig $1 | grep 'inet '; }
$> getIP eth0

inet addr:192.168.1.2 Bcast:192.168.255.255 Mask:255.255.0.0

遞歸函數

在Bash中,函數同樣支持遞歸調用(可以調用自身的函數)。例如,F() { echo $1; F hello;sleep 1; }。

導出函數
函數也能像環境變量一樣用export導出,如此一來,函數的作用域就可以擴展到子進程中:

export -f fname
$> function getIP() { /sbin/ifconfig $1 | grep 'inet '; }
$> echo "getIP eth0" >test.sh
$> sh test.sh
sh: getIP: No such file or directory
$> export -f getIP
$> sh test.sh

inet addr: 192.168.1.2 Bcast: 192.168.255.255 Mask:255.255.0.0

讀取命令返回值(狀態)
命令的返回值被保存在變量$?中。


cmd; echo $?;

返回值被稱爲退出狀態。它可用於確定命令執行成功與否。如果命令成功退出,那麼退出狀 態爲0,否則爲非0。

下面的腳本可以報告命令是否成功結束:

#!/bin/bash
#文件名: success_test.sh #對命令行參數求值,比如success_test.sh ‘ls | grep txt’ eval $@
if [ $? -eq 0 ];
then
	echo "$CMD executed successfully"
else
	echo "$CMD terminated unsuccessfully"
fi

向命令傳遞參數
大多數應用都能夠接受不同格式的參數。假設-p、-v是可用選項,-k N是另一個可以接受
數字的選項,同時該命令還要求使用一個文件名作爲參數。那麼,它有如下幾種執行方式:

$ command -p -v -k 1 file
$ command -pv -k 1 file
$ command -vpk 1 file
$ command file -pvk 1

在腳本中,命令行參數可以依據其在命令行中的位置來訪問。第一個參數是$1,第二個參數 是$2,以此類推。
下面的語句可以顯示出前3個命令行參數:

echo $1 $2 $3

更爲常見的處理方式是迭代所有的命令行參數。shift命令可以將參數依次向左移動一個位 置,讓腳本能夠使用$1來訪問到每一個參數。下面的代碼顯示出了所有的命令行參數:

$ cat showArgs.sh
for i in `seq 1 $#`
do
echo $i is $1
shift
done
$ sh showArgs.sh a b c

1 is a
2 is b
3 is c

發佈了44 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章