一篇文章學(xué)會(huì)——shell腳本編寫

用了caffe有一段時(shí)間了捌议,感覺自己寫shell腳本的能力有待提高,特地從菜鳥筆記處系統(tǒng)的看了一遍嚼黔,其實(shí)學(xué)習(xí)基礎(chǔ)就可细层,內(nèi)容也不多,我就不總結(jié)了唬涧。把網(wǎng)站上的內(nèi)容用markdown重新編輯了一下疫赎,各位可以根據(jù)需要看看;

參考網(wǎng)站:http://www.runoob.com/

第一個(gè)shell腳本:
打開文本編輯器(可以使用 vi/vim 命令來(lái)創(chuàng)建文件)碎节,新建一個(gè)文件 test.sh捧搞,擴(kuò)展名為 sh(sh代表shell),擴(kuò)展名并不影響腳本執(zhí)行狮荔,見名知意就好胎撇,如果你用 php 寫 shell 腳本,擴(kuò)展名就用 php 好了殖氏。

#晚树!/bin/bash
echo "Hello World !"
#! 是一個(gè)約定的標(biāo)記,它告訴系統(tǒng)這個(gè)腳本需要什么解釋器來(lái)執(zhí)行雅采,即使用哪一種 Shell爵憎。

echo 命令用于向窗口輸出文本。

運(yùn)行shell腳本的兩個(gè)方法:
1.作為可執(zhí)行程序:
將上面的代碼保存為 test.sh总滩,并 cd 到相應(yīng)目錄:

chmod +x ./test.sh  #使腳本具有執(zhí)行權(quán)限
./test.sh  #執(zhí)行腳本

注意纲堵,一定要寫成 ./test.sh,而不是 test.sh闰渔,運(yùn)行其它二進(jìn)制的程序也一樣席函,直接寫 test.sh,linux 系統(tǒng)會(huì)去 PATH 里尋找有沒有叫 test.sh 的冈涧,而只有 /bin, /sbin, /usr/bin茂附,/usr/sbin 等在 PATH 里正蛙,你的當(dāng)前目錄通常不在 PATH 里,所以寫成 test.sh 是會(huì)找不到命令的营曼,要用 ./test.sh 告訴系統(tǒng)說乒验,就在當(dāng)前目錄找。

2.作為解釋器參數(shù):
這種運(yùn)行方式是蒂阱,直接運(yùn)行解釋器锻全,其參數(shù)就是 shell 腳本的文件名,如:

/bin/sh test.sh
/bin/php test.php

shell變量
定義變量時(shí)录煤,變量名不加美元符號(hào)($鳄厌,PHP語(yǔ)言中變量需要),如:

your_name="runoob.com"

注意妈踊,變量名和等號(hào)之間不能有空格了嚎,這可能和你熟悉的所有編程語(yǔ)言都不一樣。同時(shí)廊营,變量名的命名須遵循如下規(guī)則:

命名只能使用英文字母歪泳,數(shù)字和下劃線,首個(gè)字符不能以數(shù)字開頭露筒。

中間不能有空格呐伞,可以使用下劃線(_)。

不能使用標(biāo)點(diǎn)符號(hào)邀窃。

不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)荸哟。

除了顯式地直接賦值假哎,還可以用語(yǔ)句給變量賦值瞬捕,如:

for file in `ls /etc` 或   for file in $(ls /etc)

以上語(yǔ)句將 /etc 下目錄的文件名循環(huán)出來(lái)。

使用變量
使用一個(gè)定義過的變量舵抹,只要在變量名前面加美元符號(hào)即可肪虎,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

注:變量名外面的花括號(hào)是可選的,加不加都行惧蛹,加花括號(hào)是為了幫助解釋器識(shí)別變量的邊界扇救,推薦給所有變量加上花括號(hào),這是個(gè)好的編程習(xí)慣香嗓。

已定義的變量迅腔,可以被重新定義,如:

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

這樣寫是合法的靠娱,但注意沧烈,第二次賦值的時(shí)候不能寫$ 使用變量的時(shí)候才加美元符。

只讀變量
使用 readonly 命令可以將變量定義為只讀變量像云,只讀變量的值不能被改變锌雀。

#!/bin/bash
myUrl="http://www.w3cschool.cc"
readonly myUrl
myUrl="http://www.runoob.com"
運(yùn)行腳本是會(huì)出錯(cuò)蚂夕。

刪除變量
使用 unset 命令可以刪除變量。語(yǔ)法:

unset variable_name

變量被刪除后不能再次使用腋逆。unset 命令不能刪除只讀變量婿牍。

變量類型
運(yùn)行shell時(shí),會(huì)同時(shí)存在三種變量:

  1. 局部變量
    局部變量在腳本或命令中定義惩歉,僅在當(dāng)前shell實(shí)例中有效等脂,其他shell啟動(dòng)的程序不能訪問局部變量。

  2. 環(huán)境變量
    所有的程序撑蚌,包括shell啟動(dòng)的程序慎菲,都能訪問環(huán)境變量,有些程序需要環(huán)境變量來(lái)保證其正常運(yùn)行锨并。必要的時(shí)候shell腳本也可以定義環(huán)境變量露该。

  3. shell變量
    shell變量是由shell程序設(shè)置的特殊變量。shell變量中有一部分是環(huán)境變量第煮,有一部分是局部變量解幼,這些變量保證了shell的正常運(yùn)行

shell字符串
字符串是shell編程中最常用最有用的數(shù)據(jù)類型(除了數(shù)字和字符串,也沒啥其它類型好用了)包警,字符串可以用單引號(hào)撵摆,也可以用雙引號(hào),也可以不用引號(hào)害晦。單雙引號(hào)的區(qū)別跟PHP類似特铝。

單引號(hào):

str='this is a string'

單引號(hào)字符串的限制:

單引號(hào)里的任何字符都會(huì)原樣輸出,單引號(hào)字符串中的變量是無(wú)效的壹瘟;

單引號(hào)字串中不能出現(xiàn)單引號(hào)(對(duì)單引號(hào)使用轉(zhuǎn)義符后也不行)鲫剿。

雙引號(hào):

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"

雙引號(hào)的優(yōu)點(diǎn):

雙引號(hào)里可以有變量

雙引號(hào)里可以出現(xiàn)轉(zhuǎn)義字符

拼接字符串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

獲取字符串長(zhǎng)度

string="abcd"
echo ${#string} #輸出 4

提取子字符串
以下實(shí)例從字符串第 2 個(gè)字符開始截取 4 個(gè)字符:

string="runoob is a great site"
echo ${string:1:4} # 輸出 unoo

查找子字符串
查找字符 "i 或 s" 的位置:

string="runoob is a great company"
echo `expr index "$string" is`  # 輸出 8

注意: 以上腳本中 "`" 是反引號(hào),而不是單引號(hào) "'"稻轨,不要看錯(cuò)了哦灵莲。

Shell 數(shù)組
bash支持一維數(shù)組(不支持多維數(shù)組),并且沒有限定數(shù)組的大小殴俱。

類似與C語(yǔ)言政冻,數(shù)組元素的下標(biāo)由0開始編號(hào)。獲取數(shù)組中的元素要利用下標(biāo)线欲,下標(biāo)可以是整數(shù)或算術(shù)表達(dá)式明场,其值應(yīng)大于或等于0。

定義數(shù)組
在Shell中李丰,用括號(hào)來(lái)表示數(shù)組苦锨,數(shù)組元素用"空格"符號(hào)分割開。定義數(shù)組的一般形式為:

數(shù)組名=(值1 值2 ... 值n)
例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

還可以單獨(dú)定義數(shù)組的各個(gè)分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用連續(xù)的下標(biāo),而且下標(biāo)的范圍沒有限制逆屡。

讀取數(shù)組
讀取數(shù)組元素值的一般格式是:

${數(shù)組名[下標(biāo)]}

例如:

valuen=${array_name[n]}

使用@符號(hào)可以獲取數(shù)組中的所有元素圾旨,例如:

echo ${array_name[@]}
獲取數(shù)組的長(zhǎng)度
獲取數(shù)組長(zhǎng)度的方法與獲取字符串長(zhǎng)度的方法相同,例如:

# 取得數(shù)組元素的個(gè)數(shù)
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數(shù)組單個(gè)元素的長(zhǎng)度
lengthn=${#array_name[n]}

Shell 注釋
以"#"開頭的行就是注釋魏蔗,會(huì)被解釋器忽略砍的。

sh里沒有多行注釋,只能每一行加一個(gè)#號(hào)莺治。只能像這樣:

#--------------------------------------------
# 這是一個(gè)注釋
# author:菜鳥教程
# site:www.runoob.com
# slogan:學(xué)的不僅是技術(shù)廓鞠,更是夢(mèng)想!
#--------------------------------------------
##### 用戶配置區(qū) 開始 #####
#
#
# 這里可以添加腳本描述信息
# 
#
用戶配置區(qū) 結(jié)束

如果在開發(fā)過程中谣旁,遇到大段的代碼需要臨時(shí)注釋起來(lái)床佳,過一會(huì)兒又取消注釋,怎么辦呢榄审?

每一行加個(gè)#符號(hào)太費(fèi)力了砌们,可以把這一段要注釋的代碼用一對(duì)花括號(hào)括起來(lái),定義成一個(gè)函數(shù)搁进,沒有地方調(diào)用這個(gè)函數(shù)浪感,這塊代碼就不會(huì)執(zhí)行,達(dá)到了和注釋一樣的效果饼问。

Shell 傳遞參數(shù)
我們可以在執(zhí)行 Shell 腳本時(shí)影兽,向腳本傳遞參數(shù),腳本內(nèi)獲取參數(shù)的格式為:$n莱革。n 代表一個(gè)數(shù)字峻堰,1 為執(zhí)行腳本的第一個(gè)參數(shù),2 為執(zhí)行腳本的第二個(gè)參數(shù)盅视,以此類推……

實(shí)例
以下實(shí)例我們向腳本傳遞三個(gè)參數(shù)捐名,并分別輸出,其中 $0 為執(zhí)行的文件名:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com
?
echo "Shell 傳遞參數(shù)實(shí)例左冬!";
echo "執(zhí)行的文件名:$0";
echo "第一個(gè)參數(shù)為:$1";
echo "第二個(gè)參數(shù)為:$2";
echo "第三個(gè)參數(shù)為:$3";

為腳本設(shè)置可執(zhí)行權(quán)限桐筏,并執(zhí)行腳本纸型,輸出結(jié)果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3

Shell 傳遞參數(shù)實(shí)例拇砰!
執(zhí)行的文件名:./test.sh
第一個(gè)參數(shù)為:1
第二個(gè)參數(shù)為:2
第三個(gè)參數(shù)為:3
另外,還有幾個(gè)特殊字符用來(lái)處理參數(shù):

參數(shù)處理 說明
$# 傳遞到腳本的參數(shù)個(gè)數(shù)
$* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)狰腌。如"用「」括起來(lái)的情況除破、以1 n"的形式輸出所有參數(shù)。
$$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)
$! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@ 與相同琼腔,但是使用時(shí)加引號(hào)瑰枫,并在引號(hào)中返回每個(gè)參數(shù)。如@"用「"」括起來(lái)的情況、以"2" … "$n" 的形式輸出所有參數(shù)光坝。
$- 顯示Shell使用的當(dāng)前選項(xiàng)尸诽,與set命令功能相同。
$? 顯示最后命令的退出狀態(tài)盯另。0表示沒有錯(cuò)誤性含,其他任何值表明有錯(cuò)誤。
#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com
?
echo "Shell 傳遞參數(shù)實(shí)例鸳惯!";
echo "第一個(gè)參數(shù)為:$1";
?
echo "參數(shù)個(gè)數(shù)為:$#";
echo "傳遞的參數(shù)作為一個(gè)字符串顯示:$*";

Shell 數(shù)組
數(shù)組中可以存放多個(gè)值商蕴。Bash Shell 只支持一維數(shù)組(不支持多維數(shù)組),初始化時(shí)不需要定義數(shù)組大兄シⅰ(與 PHP 類似)绪商。

與大部分編程語(yǔ)言類似,數(shù)組元素的下標(biāo)由0開始辅鲸。

Shell 數(shù)組用括號(hào)來(lái)表示格郁,元素用"空格"符號(hào)分割開,語(yǔ)法格式如下:

array_name=(value1 ... valuen)

實(shí)例

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com
?
my_array=(A B "C" D)

我們也可以使用下標(biāo)來(lái)定義數(shù)組:

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

讀取數(shù)組
讀取數(shù)組元素值的一般格式是:

${array_name[index]}

實(shí)例

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

my_array=(A B "C" D)

echo "第一個(gè)元素為: ${my_array[0]}"
echo "第二個(gè)元素為: ${my_array[1]}"
echo "第三個(gè)元素為: ${my_array[2]}"
echo "第四個(gè)元素為: ${my_array[3]}"

執(zhí)行腳本独悴,輸出結(jié)果如下所示:

$ chmod +x test.sh 
$ ./test.sh

第一個(gè)元素為: A
第二個(gè)元素為: B
第三個(gè)元素為: C
第四個(gè)元素為: D

獲取數(shù)組中的所有元素
使用@ 或 * 可以獲取數(shù)組中的所有元素理张,例如:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "數(shù)組的元素為: ${my_array[*]}"
echo "數(shù)組的元素為: ${my_array[@]}"

執(zhí)行腳本,輸出結(jié)果如下所示:

$ chmod +x test.sh 
$ ./test.sh

數(shù)組的元素為: A B C D
數(shù)組的元素為: A B C D

獲取數(shù)組的長(zhǎng)度

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "數(shù)組元素個(gè)數(shù)為: ${#my_array[*]}"
echo "數(shù)組元素個(gè)數(shù)為: ${#my_array[@]}"

執(zhí)行腳本绵患,輸出結(jié)果如下所示:

$ chmod +x test.sh 
$ ./test.sh

數(shù)組元素個(gè)數(shù)為: 4
數(shù)組元素個(gè)數(shù)為: 4

Shell 基本運(yùn)算符
Shell 和其他編程語(yǔ)言一樣雾叭,支持多種運(yùn)算符,包括:

算數(shù)運(yùn)算符

關(guān)系運(yùn)算符

布爾運(yùn)算符

字符串運(yùn)算符

文件測(cè)試運(yùn)算符

原生bash不支持簡(jiǎn)單的數(shù)學(xué)運(yùn)算落蝙,但是可以通過其他命令來(lái)實(shí)現(xiàn)织狐,例如 awk 和 expr,expr 最常用筏勒。

expr 是一款表達(dá)式計(jì)算工具移迫,使用它能完成表達(dá)式的求值操作。

例如管行,兩個(gè)數(shù)相加(注意使用的是反引號(hào) ` 而不是單引號(hào) '):

#!/bin/bash

val=`expr 2 + 2`
echo "兩數(shù)之和為 : $val"

執(zhí)行腳本厨埋,輸出結(jié)果如下所示:

兩數(shù)之和為 : 4

兩點(diǎn)注意:

表達(dá)式和運(yùn)算符之間要有空格,例如 2+2 是不對(duì)的捐顷,必須寫成 2 + 2荡陷,這與我們熟悉的大多數(shù)編程語(yǔ)言不一樣。

完整的表達(dá)式要被 包含迅涮,注意這個(gè)字符不是常用的單引號(hào)废赞,在 Esc 鍵下邊。

算術(shù)運(yùn)算符
下表列出了常用的算術(shù)運(yùn)算符叮姑,假定變量 a 為 10唉地,變量 b 為 20:

運(yùn)算符 說明 舉例
+ 加法 expr $a + $b 結(jié)果為 30。
- 減法 expr $a - $b 結(jié)果為 -10。
* 乘法 expr $a * $b 結(jié)果為 200耘沼。
/ 除法 expr $b / $a 結(jié)果為 2极颓。
% 取余 expr $b % $a 結(jié)果為 0。
= 賦值 a=$b 將把變量 b 的值賦給 a群嗤。
== 相等 讼昆。用于比較兩個(gè)數(shù)字,相同則返回 true骚烧。 [ b ] 返回 false浸赫。
!= 不相等。 用于比較兩個(gè)數(shù)字赃绊,不相同則返回 true既峡。 [ b ] 返回 true。

注意:條件表達(dá)式要放在方括號(hào)之間碧查,并且要有空格忠售,例如: [b] 是錯(cuò)誤的泰佳,必須寫成 [ b ]黔宛。

實(shí)例
算術(shù)運(yùn)算符實(shí)例如下:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

執(zhí)行腳本疆拘,輸出結(jié)果如下所示:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

注意:

乘號(hào)(*)前邊必須加反斜杠()才能實(shí)現(xiàn)乘法運(yùn)算;

if...then...fi 是條件語(yǔ)句,后續(xù)將會(huì)講解贩耐。

在 MAC 中 shell 的 expr 語(yǔ)法是:$((表達(dá)式))更鲁,此處表達(dá)式中的 "*" 不需要轉(zhuǎn)義符號(hào) "" 。

關(guān)系運(yùn)算符
關(guān)系運(yùn)算符只支持?jǐn)?shù)字,不支持字符串,除非字符串的值是數(shù)字鸿染。

下表列出了常用的關(guān)系運(yùn)算符免猾,假定變量 a 為 10,變量 b 為 20:

運(yùn)算符 說明 舉例
-eq 檢測(cè)兩個(gè)數(shù)是否相等肯夏,相等返回 true经宏。 [ b ] 返回 false。
-ne 檢測(cè)兩個(gè)數(shù)是否相等驯击,不相等返回 true烁兰。 [ b ] 返回 true。
-gt 檢測(cè)左邊的數(shù)是否大于右邊的徊都,如果是沪斟,則返回 true。 [ b ] 返回 false暇矫。
-lt 檢測(cè)左邊的數(shù)是否小于右邊的主之,如果是,則返回 true李根。 [ b ] 返回 true槽奕。
-ge 檢測(cè)左邊的數(shù)是否大于等于右邊的,如果是房轿,則返回 true粤攒。 [ b ] 返回 false。
-le 檢測(cè)左邊的數(shù)是否小于等于右邊的囱持,如果是夯接,則返回 true。 [ b ] 返回 true纷妆。

實(shí)例
關(guān)系運(yùn)算符實(shí)例如下:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

執(zhí)行腳本盔几,輸出結(jié)果如下所示:

10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

布爾運(yùn)算符
下表列出了常用的布爾運(yùn)算符,假定變量 a 為 10掩幢,變量 b 為 20:

運(yùn)算符 說明 舉例
! 非運(yùn)算逊拍,表達(dá)式為 true 則返回 false上鞠,否則返回 true。 [ ! false ] 返回 true顺献。
-o 或運(yùn)算旗国,有一個(gè)表達(dá)式為 true 則返回 true枯怖。 [ b -gt 100 ] 返回 true注整。
-a 與運(yùn)算,兩個(gè)表達(dá)式都為 true 才返回 true度硝。 [ b -gt 100 ] 返回 false肿轨。

實(shí)例
布爾運(yùn)算符實(shí)例如下:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi

執(zhí)行腳本,輸出結(jié)果如下所示:

10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 或 20 大于 100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false

邏輯運(yùn)算符
以下介紹 Shell 的邏輯運(yùn)算符蕊程,假定變量 a 為 10椒袍,變量 b 為 20:

運(yùn)算符 說明 舉例
&& 邏輯的 AND [[ Misplaced &b -gt 100 ]] 返回 false
邏輯的 OR [[ b -gt 100 ]] 返回 true

實(shí)例
邏輯運(yùn)算符實(shí)例如下:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

執(zhí)行腳本,輸出結(jié)果如下所示:

返回 false
返回 true

字符串運(yùn)算符
下表列出了常用的字符串運(yùn)算符藻茂,假定變量 a 為 "abc"驹暑,變量 b 為 "efg":

運(yùn)算符 說明 舉例
= 檢測(cè)兩個(gè)字符串是否相等,相等返回 true辨赐。 [ b ] 返回 false优俘。
!= 檢測(cè)兩個(gè)字符串是否相等,不相等返回 true掀序。 [ b ] 返回 true帆焕。
-z 檢測(cè)字符串長(zhǎng)度是否為0,為0返回 true不恭。 [ -z $a ] 返回 false叶雹。
-n 檢測(cè)字符串長(zhǎng)度是否為0,不為0返回 true换吧。 [ -n $a ] 返回 true折晦。
str 檢測(cè)字符串是否為空,不為空返回 true沾瓦。 [ $a ] 返回 true满着。

實(shí)例
字符串運(yùn)算符實(shí)例如下:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a="abc"
b="efg"

if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
   echo "-z $a : 字符串長(zhǎng)度為 0"
else
   echo "-z $a : 字符串長(zhǎng)度不為 0"
fi
if [ -n $a ]
then
   echo "-n $a : 字符串長(zhǎng)度不為 0"
else
   echo "-n $a : 字符串長(zhǎng)度為 0"
fi
if [ $a ]
then
   echo "$a : 字符串不為空"
else
   echo "$a : 字符串為空"
fi

執(zhí)行腳本,輸出結(jié)果如下所示:

abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串長(zhǎng)度不為 0
-n abc : 字符串長(zhǎng)度不為 0
abc : 字符串不為空

文件測(cè)試運(yùn)算符
文件測(cè)試運(yùn)算符用于檢測(cè) Unix 文件的各種屬性暴拄。

屬性檢測(cè)描述如下:

操作符 說明 舉例
-b file 檢測(cè)文件是否是塊設(shè)備文件漓滔,如果是,則返回 true乖篷。 [ -b $file ] 返回 false响驴。
-c file 檢測(cè)文件是否是字符設(shè)備文件,如果是撕蔼,則返回 true豁鲤。 [ -c $file ] 返回 false秽誊。
-d file 檢測(cè)文件是否是目錄,如果是琳骡,則返回 true锅论。 [ -d $file ] 返回 false。
-f file 檢測(cè)文件是否是普通文件(既不是目錄楣号,也不是設(shè)備文件)最易,如果是,則返回 true炫狱。 [ -f $file ] 返回 true藻懒。
-g file 檢測(cè)文件是否設(shè)置了 SGID 位,如果是视译,則返回 true嬉荆。 [ -g $file ] 返回 false。
-k file 檢測(cè)文件是否設(shè)置了粘著位(Sticky Bit)酷含,如果是鄙早,則返回 true。 [ -k $file ] 返回 false椅亚。
-p file 檢測(cè)文件是否是有名管道限番,如果是,則返回 true什往。 [ -p $file ] 返回 false扳缕。
-u file 檢測(cè)文件是否設(shè)置了 SUID 位,如果是别威,則返回 true躯舔。 [ -u $file ] 返回 false。
-r file 檢測(cè)文件是否可讀省古,如果是粥庄,則返回 true。 [ -r $file ] 返回 true豺妓。
-w file 檢測(cè)文件是否可寫惜互,如果是,則返回 true琳拭。 [ -w $file ] 返回 true训堆。
-x file 檢測(cè)文件是否可執(zhí)行,如果是白嘁,則返回 true坑鱼。 [ -x $file ] 返回 true。
-s file 檢測(cè)文件是否為空(文件大小是否大于0)絮缅,不為空返回 true鲁沥。 [ -s $file ] 返回 true呼股。
-e file 檢測(cè)文件(包括目錄)是否存在,如果是画恰,則返回 true彭谁。 [ -e $file ] 返回 true。

實(shí)例
變量 file 表示文件"/var/www/runoob/test.sh"允扇,它的大小為100字節(jié)缠局,具有 rwx 權(quán)限。下面的代碼蔼两,將檢測(cè)該文件的各種屬性:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

file="/var/www/runoob/test.sh"
if [ -r $file ]
then
   echo "文件可讀"
else
   echo "文件不可讀"
fi
if [ -w $file ]
then
   echo "文件可寫"
else
   echo "文件不可寫"
fi
if [ -x $file ]
then
   echo "文件可執(zhí)行"
else
   echo "文件不可執(zhí)行"
fi
if [ -f $file ]
then
   echo "文件為普通文件"
else
   echo "文件為特殊文件"
fi
if [ -d $file ]
then
   echo "文件是個(gè)目錄"
else
   echo "文件不是個(gè)目錄"
fi
if [ -s $file ]
then
   echo "文件不為空"
else
   echo "文件為空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

執(zhí)行腳本甩鳄,輸出結(jié)果如下所示:

文件可讀
文件可寫
文件可執(zhí)行
文件為普通文件
文件不是個(gè)目錄
文件不為空
文件存在

Shell echo命令
Shell 的 echo 指令與 PHP 的 echo 指令類似逞度,都是用于字符串的輸出额划。命令格式:

echo string

您可以使用echo實(shí)現(xiàn)更復(fù)雜的輸出格式控制。

1.顯示普通字符串:

echo "It is a test"

這里的雙引號(hào)完全可以省略档泽,以下命令與上面實(shí)例效果一致:

echo It is a test

2.顯示轉(zhuǎn)義字符

echo "\"It is a test\""

結(jié)果將是:

"It is a test"

同樣俊戳,雙引號(hào)也可以省略

3.顯示變量
read 命令從標(biāo)準(zhǔn)輸入中讀取一行,并把輸入行的每個(gè)字段的值指定給 shell 變量

#!/bin/sh
read name 
echo "$name It is a test"

以上代碼保存為 test.sh,name 接收標(biāo)準(zhǔn)輸入的變量馆匿,結(jié)果將是:

[root@www ~]# sh test.sh
OK                     #標(biāo)準(zhǔn)輸入
OK It is a test        #輸出

4.顯示換行

echo -e "OK! \n" # -e 開啟轉(zhuǎn)義
echo "It it a test"

輸出結(jié)果:

OK!
It it a test

5.顯示不換行

#!/bin/sh
echo -e "OK! \c" # -e 開啟轉(zhuǎn)義 \c 不換行
echo "It is a test"

輸出結(jié)果:

OK! It is a test

6.顯示結(jié)果定向至文件

echo "It is a test" > myfile

7.原樣輸出字符串抑胎,不進(jìn)行轉(zhuǎn)義或取變量(用單引號(hào))

echo '$name\"'

輸出結(jié)果:

$name\"

8.顯示命令執(zhí)行結(jié)果

echo `date`

注意: 這里使用的是反引號(hào) `, 而不是單引號(hào) '。

結(jié)果將顯示當(dāng)前日期

Thu Jul 24 10:08:46 CST 2014

Shell printf 命令
上一章節(jié)我們學(xué)習(xí)了 Shell 的 echo 命令渐北,本章節(jié)我們來(lái)學(xué)習(xí) Shell 的另一個(gè)輸出命令 printf阿逃。

printf 命令模仿 C 程序庫(kù)(library)里的 printf() 程序。

printf 由 POSIX 標(biāo)準(zhǔn)所定義赃蛛,因此使用 printf 的腳本比使用 echo 移植性好恃锉。

printf 使用引用文本或空格分隔的參數(shù),外面可以在 printf 中使用格式化字符串呕臂,還可以制定字符串的寬度破托、左右對(duì)齊方式等。默認(rèn) printf 不會(huì)像 echo 自動(dòng)添加換行符歧蒋,我們可以手動(dòng)添加 \n土砂。

printf 命令的語(yǔ)法:

printf  format-string  [arguments...]

參數(shù)說明:
format-string: 為格式控制字符串

arguments: 為參數(shù)列表。

實(shí)例如下:

$ echo "Hello, Shell"
Hello, Shell
$ printf "Hello, Shell\n"
Hello, Shell
$

接下來(lái),我來(lái)用一個(gè)腳本來(lái)體現(xiàn)printf的強(qiáng)大功能:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com
 
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543 
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 

執(zhí)行腳本谜洽,輸出結(jié)果如下所示:

姓名     性別   體重kg
郭靖     男      66.12
楊過     男      48.65
郭芙     女      47.99
%s %c %d %f都是格式替代符

%-10s 指一個(gè)寬度為10個(gè)字符(-表示左對(duì)齊萝映,沒有則表示右對(duì)齊),任何字符都會(huì)被顯示在10個(gè)字符寬的字符內(nèi)阐虚,如果不足則自動(dòng)以空格填充序臂,超過也會(huì)將內(nèi)容全部顯示出來(lái)。

%-4.2f 指格式化為小數(shù)敌呈,其中.2指保留2位小數(shù)贸宏。

更多實(shí)例:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com
 
# format-string為雙引號(hào)
printf "%d %s\n" 1 "abc"

# 單引號(hào)與雙引號(hào)效果一樣 
printf '%d %s\n' 1 "abc" 

# 沒有引號(hào)也可以輸出
printf %s abcdef

# 格式只指定了一個(gè)參數(shù)造寝,但多出的參數(shù)仍然會(huì)按照該格式輸出,format-string 被重用
printf %s abc def

printf "%s\n" abc def

printf "%s %s %s\n" a b c d e f g h i j

# 如果沒有 arguments吭练,那么 %s 用NULL代替诫龙,%d 用 0 代替
printf "%s and %d \n" 

執(zhí)行腳本豪嚎,輸出結(jié)果如下所示:

1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 and 0

printf的轉(zhuǎn)義序列

序列 說明
\a 警告字符歧焦,通常為ASCII的BEL字符
\b 后退
\c 抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符(只在%b格式指示符控制下的參數(shù)字符串中有效),而且界拦,任何留在參數(shù)里的字符分尸、任何接下來(lái)的參數(shù)以及任何留在格式字符串中的字符锦聊,都被忽略
\f 換頁(yè)(formfeed)
\n 換行
\r 回車(Carriage return)
\t 水平制表符
\v 垂直制表符
\ 一個(gè)字面上的反斜杠字符
\ddd 表示1到3位數(shù)八進(jìn)制值的字符。僅在格式字符串中有效
\0ddd 表示1到3位的八進(jìn)制值字符

實(shí)例

$ printf "a string, no processing:<%s>\n" "A\nB"
a string, no processing:<A\nB>

$ printf "a string, no processing:<%b>\n" "A\nB"
a string, no processing:<A
B>

$ printf "www.runoob.com \a"
www.runoob.com $                  #不換行

Shell test 命令
Shell中的 test 命令用于檢查某個(gè)條件是否成立箩绍,它可以進(jìn)行數(shù)值孔庭、字符和文件三個(gè)方面的測(cè)試。

數(shù)值測(cè)試

參數(shù) 說明
-eq 等于則為真
-ne 不等于則為真
-gt 大于則為真
-ge 大于等于則為真
-lt 小于則為真
-le 小于等于則為真

實(shí)例演示:

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '兩個(gè)數(shù)相等材蛛!'
else
    echo '兩個(gè)數(shù)不相等圆到!'
fi

輸出結(jié)果:

兩個(gè)數(shù)相等!

代碼中的 [] 執(zhí)行基本的算數(shù)運(yùn)算卑吭,如:

#!/bin/bash

a=5
b=6

result=$[a+b] # 注意等號(hào)兩邊不能有空格
echo "result 為: $result"

結(jié)果為:

result 為: 11

字符串測(cè)試

參數(shù) 說明
= 等于則為真
!= 不相等則為真
-z 字符串 字符串的長(zhǎng)度為零則為真
-n 字符串 字符串的長(zhǎng)度不為零則為真

實(shí)例演示:

num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '兩個(gè)字符串相等!'
else
    echo '兩個(gè)字符串不相等!'
fi

輸出結(jié)果:

兩個(gè)字符串不相等!

文件測(cè)試

參數(shù) 說明
-e 文件名 如果文件存在則為真
-r 文件名 如果文件存在且可讀則為真
-w 文件名 如果文件存在且可寫則為真
-x 文件名 如果文件存在且可執(zhí)行則為真
-s 文件名 如果文件存在且至少有一個(gè)字符則為真
-d 文件名 如果文件存在且為目錄則為真
-f 文件名 如果文件存在且為普通文件則為真
-c 文件名 如果文件存在且為字符型特殊文件則為真
-b 文件名 如果文件存在且為塊特殊文件則為真

實(shí)例演示:

cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

輸出結(jié)果:

文件已存在!

另外芽淡,Shell還提供了與( -a )、或( -o )豆赏、非( ! )三個(gè)邏輯操作符用于將測(cè)試條件連接起來(lái)挣菲,其優(yōu)先級(jí)為:"!"最高,"-a"次之掷邦,"-o"最低白胀。例如:

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一個(gè)文件存在!'
else
    echo '兩個(gè)文件都不存在'
fi

輸出結(jié)果:

至少有一個(gè)文件存在!

Shell 流程控制
和Java、PHP等語(yǔ)言不一樣耙饰,sh的流程控制不可為空纹笼,如(以下為PHP流程控制寫法):

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // 不做任何事情
}

在sh/bash里可不能這么寫,如果else分支沒有語(yǔ)句執(zhí)行苟跪,就不要寫這個(gè)else廷痘。

if else
if
if 語(yǔ)句語(yǔ)法格式:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

寫成一行(適用于終端命令提示符):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

末尾的fi就是if倒過來(lái)拼寫,后面還會(huì)遇到類似的件已。

if else
if else 語(yǔ)法格式:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi


if else-if else
if else-if else 語(yǔ)法格式:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

以下實(shí)例判斷兩個(gè)變量是否相等:

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "沒有符合的條件"
fi

輸出結(jié)果:

a 小于 b

if else語(yǔ)句經(jīng)常與test命令結(jié)合使用笋额,如下所示:

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '兩個(gè)數(shù)字相等!'
else
    echo '兩個(gè)數(shù)字不相等!'
fi

輸出結(jié)果:

兩個(gè)數(shù)字相等!

for 循環(huán)
與其他編程語(yǔ)言類似,Shell支持for循環(huán)篷扩。

for循環(huán)一般格式為:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

寫成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

當(dāng)變量值在列表里兄猩,for循環(huán)即執(zhí)行一次所有命令,使用變量名獲取列表中的當(dāng)前取值。命令可為任何有效的shell命令和語(yǔ)句枢冤。in列表可以包含替換鸠姨、字符串和文件名。

in列表是可選的淹真,如果不用它讶迁,for循環(huán)使用命令行的位置參數(shù)。

例如核蘸,順序輸出當(dāng)前列表中的數(shù)字:

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

輸出結(jié)果:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

順序輸出字符串中的字符:

for str in 'This is a string'
do
    echo $str
done

輸出結(jié)果:

This is a string

while 語(yǔ)句
while循環(huán)用于不斷執(zhí)行一系列命令,也用于從輸入文件中讀取數(shù)據(jù)祟峦;命令通常為測(cè)試條件疆偿。其格式為:

while condition
do
    command
done

以下是一個(gè)基本的while循環(huán)处铛,測(cè)試條件是:如果int小于等于5,那么條件返回真。int從0開始,每次循環(huán)處理時(shí),int加1。運(yùn)行上述腳本燎孟,返回?cái)?shù)字1到5碍沐,然后終止磁浇。

#!/bin/sh
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

運(yùn)行腳本,輸出:

1
2
3
4
5

使用中使用了 Bash let 命令,它用于執(zhí)行一個(gè)或多個(gè)表達(dá)式,變量計(jì)算中不需要加上 $ 來(lái)表示變量戈抄,具體可查閱:Bash let 命令

戚哎。

while循環(huán)可用于讀取鍵盤信息。下面的例子中实夹,輸入信息被設(shè)置為變量FILM匀们,按<Ctrl-D>結(jié)束循環(huán)祖灰。

echo '按下 <CTRL-D> 退出'
echo -n '輸入你最喜歡的網(wǎng)站名: '
while read FILM
do
    echo "是的三妈!$FILM 是一個(gè)好網(wǎng)站"
done

運(yùn)行腳本饿凛,輸出類似下面:

按下 <CTRL-D> 退出
輸入你最喜歡的網(wǎng)站名:菜鳥教程
是的!菜鳥教程 是一個(gè)好網(wǎng)站

無(wú)限循環(huán)
無(wú)限循環(huán)語(yǔ)法格式:

while :
do
    command
done

或者

while true
do
    command
done

或者

for (( ; ; ))

until 循環(huán)
until 循環(huán)執(zhí)行一系列命令直至條件為 true 時(shí)停止锅减。

until 循環(huán)與 while 循環(huán)在處理方式上剛好相反糖儡。

一般 while 循環(huán)優(yōu)于 until 循環(huán),但在某些時(shí)候—也只是極少數(shù)情況下怔匣,until 循環(huán)更加有用握联。

until 語(yǔ)法格式:

until condition
do
    command
done

condition 一般為條件表達(dá)式,如果返回值為 false,則繼續(xù)執(zhí)行循環(huán)體內(nèi)的語(yǔ)句金闽,否則跳出循環(huán)纯露。

以下實(shí)例我們使用 until 命令來(lái)輸出 0 ~ 9 的數(shù)字:

#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

運(yùn)行結(jié)果:

輸出結(jié)果為:

0
1
2
3
4
5
6
7
8
9

case
Shell case語(yǔ)句為多選擇語(yǔ)句〈撸可以用case語(yǔ)句匹配一個(gè)值與一個(gè)模式埠褪,如果匹配成功,執(zhí)行相匹配的命令挤庇。case語(yǔ)句格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

case工作方式如上所示钞速。取值后面必須為單詞in,每一模式必須以右括號(hào)結(jié)束嫡秕。取值可以為變量或常數(shù)渴语。匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開始執(zhí)行直至 ;;淘菩。

取值將檢測(cè)匹配的每一個(gè)模式遵班。一旦模式匹配,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式潮改。如果無(wú)一匹配模式狭郑,使用星號(hào) * 捕獲該值,再執(zhí)行后面的命令汇在。

下面的腳本提示輸入1到4翰萨,與每一種模式進(jìn)行匹配:

echo '輸入 1 到 4 之間的數(shù)字:'
echo '你輸入的數(shù)字為:'
read aNum
case $aNum in
    1)  echo '你選擇了 1'
    ;;
    2)  echo '你選擇了 2'
    ;;
    3)  echo '你選擇了 3'
    ;;
    4)  echo '你選擇了 4'
    ;;
    *)  echo '你沒有輸入 1 到 4 之間的數(shù)字'
    ;;
esac

輸入不同的內(nèi)容,會(huì)有不同的結(jié)果糕殉,例如:

輸入 1 到 4 之間的數(shù)字:
你輸入的數(shù)字為:
3
你選擇了 3

跳出循環(huán)
在循環(huán)過程中亩鬼,有時(shí)候需要在未達(dá)到循環(huán)結(jié)束條件時(shí)強(qiáng)制跳出循環(huán),Shell使用兩個(gè)命令來(lái)實(shí)現(xiàn)該功能:break和continue阿蝶。

break命令
break命令允許跳出所有循環(huán)(終止執(zhí)行后面的所有循環(huán))雳锋。

下面的例子中,腳本進(jìn)入死循環(huán)直至用戶輸入數(shù)字大于5羡洁。要跳出這個(gè)循環(huán)玷过,返回到shell提示符下,需要使用break命令筑煮。

#!/bin/bash
while :
do
    echo -n "輸入 1 到 5 之間的數(shù)字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你輸入的數(shù)字為 $aNum!"
        ;;
        *) echo "你輸入的數(shù)字不是 1 到 5 之間的! 游戲結(jié)束"
            break
        ;;
    esac
done

執(zhí)行以上代碼辛蚊,輸出結(jié)果為:

輸入 1 到 5 之間的數(shù)字:3
你輸入的數(shù)字為 3!
輸入 1 到 5 之間的數(shù)字:7
你輸入的數(shù)字不是 1 到 5 之間的! 游戲結(jié)束

continue
continue命令與break命令類似,只有一點(diǎn)差別真仲,它不會(huì)跳出所有循環(huán)袋马,僅僅跳出當(dāng)前循環(huán)。

對(duì)上面的例子進(jìn)行修改:

#!/bin/bash
while :
do
    echo -n "輸入 1 到 5 之間的數(shù)字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你輸入的數(shù)字為 $aNum!"
        ;;
        *) echo "你輸入的數(shù)字不是 1 到 5 之間的!"
            continue
            echo "游戲結(jié)束"
        ;;
    esac
done

運(yùn)行代碼發(fā)現(xiàn)秸应,當(dāng)輸入大于5的數(shù)字時(shí)虑凛,該例中的循環(huán)不會(huì)結(jié)束碑宴,語(yǔ)句 echo "游戲結(jié)束" 永遠(yuǎn)不會(huì)被執(zhí)行。

Shell 函數(shù)
linux shell 可以用戶定義函數(shù)卧檐,然后在shell腳本中可以隨便調(diào)用墓懂。

shell中函數(shù)的定義格式如下:

[ function ] funname [()]

{

    action;

    [return int;]

}

說明:

1、可以帶function fun() 定義霉囚,也可以直接fun() 定義,不帶任何參數(shù)捕仔。

2、參數(shù)返回盈罐,可以顯示加:return 返回榜跌,如果不加,將以最后一條命令運(yùn)行結(jié)果盅粪,作為返回值钓葫。 return后跟數(shù)值n(0-255

下面的例子定義了一個(gè)函數(shù)并進(jìn)行調(diào)用:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com
demoFun(){
    echo "這是我的第一個(gè) shell 函數(shù)!"
}
echo "-----函數(shù)開始執(zhí)行-----"
demoFun
echo "-----函數(shù)執(zhí)行完畢-----"

輸出結(jié)果:

-----函數(shù)開始執(zhí)行-----
這是我的第一個(gè) shell 函數(shù)!
-----函數(shù)執(zhí)行完畢-----

下面定義一個(gè)帶有return語(yǔ)句的函數(shù):

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

funWithReturn(){
    echo "這個(gè)函數(shù)會(huì)對(duì)輸入的兩個(gè)數(shù)字進(jìn)行相加運(yùn)算..."
    echo "輸入第一個(gè)數(shù)字: "
    read aNum
    echo "輸入第二個(gè)數(shù)字: "
    read anotherNum
    echo "兩個(gè)數(shù)字分別為 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個(gè)數(shù)字之和為 $? !"

輸出類似下面:

這個(gè)函數(shù)會(huì)對(duì)輸入的兩個(gè)數(shù)字進(jìn)行相加運(yùn)算...
輸入第一個(gè)數(shù)字:
1
輸入第二個(gè)數(shù)字:
2
兩個(gè)數(shù)字分別為 1 和 2 !
輸入的兩個(gè)數(shù)字之和為 3 !

函數(shù)返回值在調(diào)用該函數(shù)后通過 $? 來(lái)獲得。

注意:所有函數(shù)在使用前必須定義票顾。這意味著必須將函數(shù)放在腳本開始部分础浮,直至shell解釋器首次發(fā)現(xiàn)它時(shí),才可以使用奠骄。調(diào)用函數(shù)僅使用其函數(shù)名即可豆同。

函數(shù)參數(shù)
在Shell中,調(diào)用函數(shù)時(shí)可以向其傳遞參數(shù)含鳞。在函數(shù)體內(nèi)部影锈,通過 的形式來(lái)獲取參數(shù)的值,例如蝉绷,1表示第一個(gè)參數(shù)鸭廷,$2表示第二個(gè)參數(shù)...

帶參數(shù)的函數(shù)示例:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

funWithParam(){
    echo "第一個(gè)參數(shù)為 $1 !"
    echo "第二個(gè)參數(shù)為 $2 !"
    echo "第十個(gè)參數(shù)為 $10 !"
    echo "第十個(gè)參數(shù)為 ${10} !"
    echo "第十一個(gè)參數(shù)為 ${11} !"
    echo "參數(shù)總數(shù)有 $# 個(gè)!"
    echo "作為一個(gè)字符串輸出所有參數(shù) $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

輸出結(jié)果:

第一個(gè)參數(shù)為 1 !
第二個(gè)參數(shù)為 2 !
第十個(gè)參數(shù)為 10 !
第十個(gè)參數(shù)為 34 !
第十一個(gè)參數(shù)為 73 !
參數(shù)總數(shù)有 11 個(gè)!
作為一個(gè)字符串輸出所有參數(shù) 1 2 3 4 5 6 7 8 9 34 73 !

注意,不能獲取第十個(gè)參數(shù)熔吗,獲取第十個(gè)參數(shù)需要{10}辆床。當(dāng)n>=10時(shí),需要使用${n}來(lái)獲取參數(shù)桅狠。

另外佛吓,還有幾個(gè)特殊字符用來(lái)處理參數(shù):

參數(shù)處理 說明
$# 傳遞到腳本的參數(shù)個(gè)數(shù)
$* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)
$$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)
$! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@ 與$*相同,但是使用時(shí)加引號(hào)垂攘,并在引號(hào)中返回每個(gè)參數(shù)。
$- 顯示Shell使用的當(dāng)前選項(xiàng)淤刃,與set命令功能相同晒他。
$? 顯示最后命令的退出狀態(tài)。0表示沒有錯(cuò)誤逸贾,其他任何值表明有錯(cuò)誤陨仅。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末津滞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灼伤,更是在濱河造成了極大的恐慌触徐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狐赡,死亡現(xiàn)場(chǎng)離奇詭異撞鹉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)颖侄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門鸟雏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人览祖,你說我怎么就攤上這事孝鹊。” “怎么了展蒂?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵又活,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我锰悼,道長(zhǎng)柳骄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任松捉,我火速辦了婚禮夹界,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隘世。我一直安慰自己可柿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布丙者。 她就那樣靜靜地躺著复斥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪械媒。 梳的紋絲不亂的頭發(fā)上目锭,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音纷捞,去河邊找鬼痢虹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛主儡,可吹牛的內(nèi)容都是我干的奖唯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼糜值,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丰捷!你這毒婦竟也來(lái)了坯墨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤病往,失蹤者是張志新(化名)和其女友劉穎捣染,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體停巷,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耍攘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叠穆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片少漆。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖硼被,靈堂內(nèi)的尸體忽然破棺而出示损,到底是詐尸還是另有隱情,我是刑警寧澤嚷硫,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布检访,位于F島的核電站,受9級(jí)特大地震影響仔掸,放射性物質(zhì)發(fā)生泄漏脆贵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一起暮、第九天 我趴在偏房一處隱蔽的房頂上張望卖氨。 院中可真熱鬧,春花似錦负懦、人聲如沸筒捺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)系吭。三九已至,卻和暖如春颗品,著一層夾襖步出監(jiān)牢的瞬間肯尺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工躯枢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留则吟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓锄蹂,卻偏偏與公主長(zhǎng)得像逾滥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355