一荠割、基本介紹
Shell Script是利用shell的功能所寫(xiě)的一個(gè)程序,這個(gè)程序是使用純文本文件旺矾,將一些shell的語(yǔ)法與指令寫(xiě)在里面蔑鹦,然后用正規(guī)表示法,管道命令以及數(shù)據(jù)流重導(dǎo)向等功能箕宙,以達(dá)到我們所想要的處理目的嚎朽。
二、Shell 腳本的創(chuàng)建
打開(kāi)文本編輯器(可以使用 vi/vim 命令來(lái)創(chuàng)建文件)柬帕,新建一個(gè)文件 first.sh哟忍,擴(kuò)展名為 sh(sh代表shell),擴(kuò)展名并不影響腳本執(zhí)行雕崩,見(jiàn)名知意就好魁索,如果你用 php 寫(xiě) shell 腳本,擴(kuò)展名就用 php 好了盼铁。
創(chuàng)建方法:終端輸入 touch first.sh 或 vim first.sh 即可創(chuàng)建粗蔚。
#!/bin/bash
echo "Hello World !"
三、運(yùn)行 Shell 腳本的兩種方法
1饶火、作為可執(zhí)行程序
將上面的代碼保存為 first.sh鹏控,并 cd 到相應(yīng)目錄:
chmod +x ./first.sh #使腳本具有執(zhí)行權(quán)限
./first.sh #執(zhí)行腳本
2致扯、作為解釋器參數(shù)
這種運(yùn)行方式是,直接運(yùn)行解釋器当辐,其參數(shù)就是 shell 腳本的文件名抖僵,如:
sh first.sh
四、詳細(xì)介紹
Shell 變量
1缘揪、變量名的命名須遵循如下規(guī)則:
- 命名只能使用英文字母耍群,數(shù)字和下劃線(xiàn),首個(gè)字符不能以數(shù)字開(kāi)頭找筝。
- 中間不能有空格蹈垢,可以使用下劃線(xiàn)(_)。
- 不能使用標(biāo)點(diǎn)符號(hào)袖裕。
- 不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)曹抬。
2、變量的使用:
使用一個(gè)定義過(guò)的變量急鳄,只要在變量名前面加美元符號(hào)即可谤民,而且已定義的變量,可以被重新定義疾宏,例如:
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
3张足、變量類(lèi)型:
運(yùn)行shell時(shí),會(huì)同時(shí)存在三種變量:
1) 局部變量
局部變量在腳本或命令中定義灾锯,僅在當(dāng)前shell實(shí)例中有效兢榨,其他shell啟動(dòng)的程序不能訪(fǎng)問(wèn)局部變量。
2) 環(huán)境變量
所有的程序顺饮,包括shell啟動(dòng)的程序吵聪,都能訪(fǎng)問(wèn)環(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ù)類(lèi)型(除了數(shù)字和字符串佃乘,也沒(méi)啥其它類(lèi)型好用了)囱井,字符串可以用單引號(hào),也可以用雙引號(hào)趣避,也可以不用引號(hào)庞呕。單雙引號(hào)的區(qū)別跟PHP類(lèi)似。
1、單引號(hào)
str='this is a shell script'
單引號(hào)字符串的限制:
- 單引號(hào)里的任何字符都會(huì)原樣輸出住练,單引號(hào)字符串中的變量是無(wú)效的地啰;
- 單引號(hào)字串中不能出現(xiàn)單獨(dú)一個(gè)的單引號(hào)(對(duì)單引號(hào)使用轉(zhuǎn)義符后也不行),但可成對(duì)出現(xiàn)讲逛,作為字符串拼接使用亏吝。
2、雙引號(hào)
your_name='tom'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
輸出結(jié)果為:
Hello, I know you are "tom"!
雙引號(hào)的優(yōu)點(diǎn):
- 雙引號(hào)里可以有變量盏混;
- 雙引號(hào)里可以出現(xiàn)轉(zhuǎn)義字符蔚鸥。
3、拼接字符串
your_name="tom"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
輸出結(jié)果為:
hello, tom ! hello, tom !
4括饶、獲取字符串長(zhǎng)度
string="nihao"
echo "nihao的長(zhǎng)度為:${#string}"
輸出結(jié)果為:
nihao的長(zhǎng)度為:5
5株茶、提取子字符串
以下實(shí)例從字符串第 2 個(gè)字符開(kāi)始截取 6 個(gè)字符:
string="this is a shell script"
echo ${string:1:6}
輸出結(jié)果為:
his is
Shell 數(shù)組
1来涨、定義數(shù)組
數(shù)組中可以存放多個(gè)值图焰。Bash Shell 只支持一維數(shù)組(不支持多維數(shù)組),初始化時(shí)不需要定義數(shù)組大斜钠(與 PHP 類(lèi)似)技羔。與大部分編程語(yǔ)言類(lèi)似,數(shù)組元素的下標(biāo)由0開(kāi)始卧抗。
Shell 數(shù)組用括號(hào)來(lái)表示藤滥,元素用"空格"符號(hào)分割開(kāi),語(yǔ)法格式如下:
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
2社裆、讀取數(shù)組
讀取數(shù)組元素值的一般格式是:
value=${array_name[n]}
例如:
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]}"
輸出結(jié)果為:
第一個(gè)元素為: A
第二個(gè)元素為: B
第三個(gè)元素為: C
第四個(gè)元素為: D
3拙绊、獲取數(shù)組中的所有元素
使用 @ 符號(hào)可以獲取數(shù)組中的所有元素,例如:
my_array=(A B "C" D)
echo "元素總數(shù)為: ${my_array[@]}"
echo "元素總數(shù)為: ${my_array[*]}"
輸出結(jié)果為:
元素總數(shù)為: A B C D
元素總數(shù)為: A B C D
4泳秀、獲取數(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]}
例如:
my_array=(A B "C" D)
echo "元素個(gè)數(shù)為: ${#my_array[@]}"
echo "元素個(gè)數(shù)為: ${#my_array[*]}"
echo "第三個(gè)元素長(zhǎng)度為: ${#my_array[2]}"
輸出結(jié)果為:
元素個(gè)數(shù)為: 4
元素個(gè)數(shù)為: 4
第三個(gè)元素長(zhǎng)度為: 1
Shell 注釋
1标沪、單行注釋
以 # 開(kāi)頭的行就是注釋?zhuān)瑫?huì)被解釋器忽略。
#echo "nihao"
2嗜傅、多行注釋
:<<EOF
echo "nihao"
echo "nihao"
echo "nihao""
EOF
EOF 也可以使用其他符號(hào):
:<<!
echo "nihao"
echo "nihao"
echo "nihao""
!
Shell 傳遞參數(shù)
我們可以在執(zhí)行 Shell 腳本時(shí)金句,向腳本傳遞參數(shù),腳本內(nèi)獲取參數(shù)的格式為:0 為執(zhí)行的文件名。例如:
function passparam()
{
echo "Shell 傳遞參數(shù)實(shí)例棕洋!";
echo "執(zhí)行的文件名:$0";
echo "第一個(gè)參數(shù)為:$1";
echo "第二個(gè)參數(shù)為:$2";
echo "第三個(gè)參數(shù)為:$3";
}
passparam a b c
輸出結(jié)果為:
Shell 傳遞參數(shù)實(shí)例挡闰!
執(zhí)行的文件名:first.sh
第一個(gè)參數(shù)為:a
第二個(gè)參數(shù)為:b
第三個(gè)參數(shù)為:c
備注:幾個(gè)用來(lái)處理參數(shù)的特殊字符:
Shell echo命令
1、顯示變量
read 命令從標(biāo)準(zhǔn)輸入中讀取一行,并把輸入行的每個(gè)字段的值指定給 shell 變量拍冠。例如:
echo "輸入你的姓名:"
read name
echo "my name is $name"
運(yùn)行得到:
輸入你的姓名:
輸入內(nèi)容:
輸入你的姓名:
tom
得到結(jié)果:
輸入你的姓名:
tom
my name is tom
Shell 基本運(yùn)算符
Shell 和其他編程語(yǔ)言一樣尿这,支持多種運(yùn)算符簇抵,包括:算數(shù)運(yùn)算符、關(guān)系運(yùn)算符射众、布爾運(yùn)算符碟摆、字符串運(yùn)算符和文件測(cè)試運(yùn)算符。
注意:
1)表達(dá)式和運(yùn)算符之間要有空格叨橱,例如 2+2 是不對(duì)的典蜕,必須寫(xiě)成 2 + 2。
2)完整的表達(dá)式要被 ` `
包含罗洗,注意這個(gè)字符不是常用的單引號(hào)愉舔,在 Esc 鍵下邊。
1伙菜、算術(shù)運(yùn)算符
運(yùn)算符 | 說(shuō)明 |
---|---|
+ | 加法 |
- | 減法 |
* | 乘法(乘號(hào)前邊必須加反斜杠才能實(shí)現(xiàn)乘法運(yùn)算) |
/ | 除法 |
% | 取余 |
= | 賦值 |
== | 相等轩缤。用于比較兩個(gè)數(shù)字,相同則返回 true贩绕。 |
!= | 不相等火的。用于比較兩個(gè)數(shù)字,不相同則返回 true |
注意:條件表達(dá)式要放在方括號(hào)之間淑倾,并且要有空格馏鹤,例如: [b] 是錯(cuò)誤的,必須寫(xiě)成 [ b ]娇哆。
舉例:
a=2
b=4
echo "a=2 b=4"
#加法
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 $a / $b`
echo "a / b = $val"
val=`expr $b % $a`
echo "b % a = $val"
if [ $a == $b ]
then
echo "a 等于 b"
else
echo "a 不等于 b"
fi
if [ $a != $b ]
then
echo "a_ 不等于 b_"
else
echo "a_ 等于 b_"
fi
輸出結(jié)果為:
a=2 b=4
a + b = 6
a - b = -2
a * b = 8
a / b = 0
b % a = 0
a 不等于 b
a_ 不等于 b_
2湃累、關(guān)系運(yùn)算符
關(guān)系運(yùn)算符只支持?jǐn)?shù)字,不支持字符串碍讨,除非字符串的值是數(shù)字治力。
運(yùn)算符 | 說(shuō)明 |
---|---|
-eq | 檢測(cè)兩個(gè)數(shù)是否相等,相等返回 true垄开。 |
-ne | 檢測(cè)兩個(gè)數(shù)是否不相等琴许,不相等返回 true |
-gt | 檢測(cè)左邊的數(shù)是否大于右邊的,如果是溉躲,則返回 true |
-lt | 檢測(cè)左邊的數(shù)是否小于右邊的榜田,如果是,則返回 true |
-ge | 檢測(cè)左邊的數(shù)是否大于等于右邊的锻梳,如果是箭券,則返回 true。 |
-le | 檢測(cè)左邊的數(shù)是否小于等于右邊的疑枯,如果是辩块,則返回 true。 |
舉例:
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
輸出結(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
3、布爾運(yùn)算符
運(yùn)算符 | 說(shuō)明 |
---|---|
! | 非運(yùn)算废亭,表達(dá)式為 true 則返回 false国章,否則返回 true。 |
-o | 或運(yùn)算豆村,有一個(gè)表達(dá)式為 true 則返回 true液兽。 |
-a | 與運(yùn)算,兩個(gè)表達(dá)式都為 true 才返回 true掌动。 |
舉例:
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
輸出結(jié)果為:
10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 或 20 大于 100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false
4四啰、邏輯運(yùn)算符
舉例:
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
輸出結(jié)果為:
返回 false
返回 true
5、字符串運(yùn)算符
運(yùn)算符 | 說(shuō)明 |
---|---|
= | 檢測(cè)兩個(gè)字符串是否相等粗恢,相等返回 true柑晒。 |
!= | 檢測(cè)兩個(gè)字符串是否相等,不相等返回 true眷射。 |
-z | 檢測(cè)字符串長(zhǎng)度是否為0匙赞,為0返回 true |
-n | 檢測(cè)字符串長(zhǎng)度是否為0,不為0返回 true凭迹。 |
$ | 檢測(cè)字符串是否為空罚屋,不為空返回 true。 |
舉例:
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
輸出結(jié)果為:
abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串長(zhǎng)度不為 0
-n abc : 字符串長(zhǎng)度不為 0
abc : 字符串不為空
6嗅绸、文件測(cè)試運(yùn)算符
文件測(cè)試運(yùn)算符用于檢測(cè) Unix 文件的各種屬性。
屬性檢測(cè)描述如下:
運(yùn)算符 | 說(shuō)明 |
---|---|
-b file | 檢測(cè)文件是否是塊設(shè)備文件撕彤,如果是鱼鸠,則返回 true。 |
-c file | 檢測(cè)文件是否是字符設(shè)備文件羹铅,如果是蚀狰,則返回 true。 |
-d file | 檢測(cè)文件是否是目錄职员,如果是麻蹋,則返回 true。 |
-f file | 檢測(cè)文件是否是普通文件(既不是目錄焊切,也不是設(shè)備文件)扮授,如果是,則返回 true专肪。 |
-g file | 檢測(cè)文件是否設(shè)置了 SGID 位刹勃,如果是,則返回 true嚎尤。 |
-k file | 檢測(cè)文件是否設(shè)置了粘著位(Sticky Bit)荔仁,如果是,則返回 true。 |
-p file | 檢測(cè)文件是否是有名管道乏梁,如果是次洼,則返回 true。 |
-u file | 檢測(cè)文件是否設(shè)置了 SUID 位遇骑,如果是滓玖,則返回 true。 |
-r file | 檢測(cè)文件是否可讀质蕉,如果是势篡,則返回 true。 |
-w file | 檢測(cè)文件是否可寫(xiě)模暗,如果是禁悠,則返回 true。 |
-x file | 檢測(cè)文件是否可執(zhí)行兑宇,如果是碍侦,則返回 true。 |
-s file | 檢測(cè)文件是否為空(文件大小是否大于0)隶糕,不為空返回 true |
-e file | 檢測(cè)文件(包括目錄)是否存在瓷产,如果是,則返回 true枚驻。 |
舉例:
備注:file="/Users/wangxueqi/Desktop/first.sh"為存放在桌面的當(dāng)前腳本濒旦。
file="/Users/wangxueqi/Desktop/first.sh"
if [ -r $file ]
then
echo "文件可讀"
else
echo "文件不可讀"
fi
if [ -w $file ]
then
echo "文件可寫(xiě)"
else
echo "文件不可寫(xiě)"
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
輸出結(jié)果為:
文件可讀
文件可寫(xiě)
文件可執(zhí)行
文件為普通文件
文件不是個(gè)目錄
文件不為空
文件存
Shell 流程控制
和Java、PHP等語(yǔ)言不一樣再登,sh的流程控制不可為空
1尔邓、if 語(yǔ)句語(yǔ)法格式:
if condition
then
command1
command2
...
commandN
fi
例如:
a=10
b=20
if [ $a == $b ]
then
echo "a 不等于 b"
fi
2、if else 語(yǔ)法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
例如:
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
else
echo "a 不等于 b"
fi
3锉矢、if else-if else 語(yǔ)法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
例如:
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 "沒(méi)有符合的條件"
fi
4梯嗽、for 循環(huán)一般格式為:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
寫(xiě)成一行:
for var in item1 item2 ... itemN; do command1; command2… done;
例如:
for value in 1 2 3 4 5
do
echo "The value is: $value"
done
輸出結(jié)果為:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
5、while 語(yǔ)句格式為:
while condition
do
command
done
例如:
int=1
while(( $int<=5 ))
do
echo "while 語(yǔ)句輸出:$int"
let "int++"
done
輸出結(jié)果為:
while 語(yǔ)句輸出:1
while 語(yǔ)句輸出:2
while 語(yǔ)句輸出:3
while 語(yǔ)句輸出:4
while 語(yǔ)句輸出:5
6沽损、case語(yǔ)句格式:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case工作方式如上所示灯节。取值后面必須為單詞in,每一模式必須以右括號(hào)結(jié)束绵估。取值可以為變量或常數(shù)炎疆。匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開(kāi)始執(zhí)行直至 ;;壹士。
取值將檢測(cè)匹配的每一個(gè)模式磷雇。一旦模式匹配,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式躏救。如果無(wú)一匹配模式唯笙,使用星號(hào) * 捕獲該值螟蒸,再執(zhí)行后面的命令。
例如:
echo '輸入 1 到 4 之間的數(shù)字:'
echo '你輸入的數(shù)字為:'
read aNum
case $aNum in
1) echo '你選擇了 1'
;;
2) echo '你選擇了 2'
;;
3) echo '你選擇了 3'
;;
4) echo '你選擇了 4'
;;
*) echo '你沒(méi)有輸入 1 到 4 之間的數(shù)字'
;;
esac
輸出結(jié)果為:
輸入 1 到 4 之間的數(shù)字:
你輸入的數(shù)字為:
3
你選擇了 3
7崩掘、跳出循環(huán)-break命令:
break命令允許跳出所有循環(huán)(終止執(zhí)行后面的所有循環(huán))七嫌。
下面的例子中,腳本進(jìn)入死循環(huán)直至用戶(hù)輸入數(shù)字大于5苞慢。要跳出這個(gè)循環(huán)诵原,返回到shell提示符下,需要使用break命令挽放。
例如:
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
輸出結(jié)果為:
輸入 1 到 5 之間的數(shù)字:3
你輸入的數(shù)字為 3!
輸入 1 到 5 之間的數(shù)字:7
你輸入的數(shù)字不是 1 到 5 之間的! 游戲結(jié)束
8绍赛、跳出循環(huán)-continue命令:
continue命令與break命令類(lèi)似,只有一點(diǎn)差別辑畦,它不會(huì)跳出所有循環(huán)吗蚌,僅僅跳出當(dāng)前循環(huán)。
對(duì)上面的例子進(jìn)行修改:
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í)行暂筝。
9箩言、esac
case的語(yǔ)法和C family語(yǔ)言差別很大,它需要一個(gè)esac(就是case反過(guò)來(lái))作為結(jié)束標(biāo)記焕襟,每個(gè)case分支用右圓括號(hào)陨收,用兩個(gè)分號(hào)表示break。
Shell 函數(shù)
shell中函數(shù)的定義格式如下:
[ function ] funname [()]
{
action;
[return int;]
}
注意:
1胧洒、可以帶function fun() 定義畏吓,也可以直接fun() 定義,不帶任何參數(shù)。
2卫漫、參數(shù)返回,可以顯示加:return 返回肾砂,如果不加列赎,將以最后一條命令運(yùn)行結(jié)果,作為返回值镐确。 return后跟數(shù)值n(0-255)包吝。
例如:
demoFun(){
echo "這是我的第一個(gè) shell 函數(shù)!"
}
echo "-----函數(shù)開(kāi)始執(zhí)行-----"
demoFun
echo "-----函數(shù)執(zhí)行完畢-----"
輸出結(jié)果為:
-----函數(shù)開(kāi)始執(zhí)行-----
這是我的第一個(gè) shell 函數(shù)!
-----函數(shù)執(zhí)行完畢-----
下面定義一個(gè)帶有return語(yǔ)句的函數(shù):
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ù)字之和為 $? !"
輸出結(jié)果為:
這個(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ù)后通過(guò) $? 來(lái)獲得。
注意:所有函數(shù)在使用前必須定義源葫。這意味著必須將函數(shù)放在腳本開(kāi)始部分诗越,直至shell解釋器首次發(fā)現(xiàn)它時(shí),才可以使用息堂。調(diào)用函數(shù)僅使用其函數(shù)名即可嚷狞。
函數(shù)參數(shù)
在Shell中块促,調(diào)用函數(shù)時(shí)可以向其傳遞參數(shù)。在函數(shù)體內(nèi)部床未,通過(guò)1表示第一個(gè)參數(shù)薇搁,$2表示第二個(gè)參數(shù)...
帶參數(shù)的函數(shù)示例:
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 !
注意:{10}。當(dāng)n>=10時(shí)啃洋,需要使用${n}來(lái)獲取參數(shù)传货。
腳本下載地址:first.sh
參考鏈接:Shell 腳本教程