Shell 腳本入門(mén)學(xué)習(xí)

一荠割、基本介紹

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ù)的格式為:n吕嘀。n 代表一個(gè)數(shù)字违寞,1 為執(zhí)行腳本的第一個(gè)參數(shù),2 為執(zhí)行腳本的第二個(gè)參數(shù)偶房,以此類(lèi)推趁曼。注意: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)之間淑倾,并且要有空格馏鹤,例如: [a==b] 是錯(cuò)誤的,必須寫(xiě)成 [ a ==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ò)n 的形式來(lái)獲取參數(shù)的值竭翠,例如,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 不能獲取第十個(gè)參數(shù)斋扰,獲取第十個(gè)參數(shù)需要{10}。當(dāng)n>=10時(shí)啃洋,需要使用${n}來(lái)獲取參數(shù)传货。


腳本下載地址:first.sh
參考鏈接:Shell 腳本教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宏娄,隨后出現(xiàn)的幾起案子问裕,更是在濱河造成了極大的恐慌,老刑警劉巖绝编,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僻澎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡十饥,警方通過(guò)查閱死者的電腦和手機(jī)窟勃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逗堵,“玉大人秉氧,你說(shuō)我怎么就攤上這事⊙殉樱” “怎么了汁咏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)作媚。 經(jīng)常有香客問(wèn)我攘滩,道長(zhǎng),這世上最難降的妖魔是什么纸泡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任漂问,我火速辦了婚禮,結(jié)果婚禮上女揭,老公的妹妹穿的比我還像新娘蚤假。我一直安慰自己,他們只是感情好吧兔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布磷仰。 她就那樣靜靜地躺著,像睡著了一般境蔼。 火紅的嫁衣襯著肌膚如雪灶平。 梳的紋絲不亂的頭發(fā)上伺通,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音民逼,去河邊找鬼泵殴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拼苍,可吹牛的內(nèi)容都是我干的笑诅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疮鲫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吆你!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起俊犯,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妇多,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后燕侠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體者祖,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年绢彤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了七问。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茫舶,死狀恐怖械巡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饶氏,我是刑警寧澤讥耗,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站疹启,受9級(jí)特大地震影響古程,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喊崖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一籍琳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贷祈,春花似錦、人聲如沸喝峦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谣蠢。三九已至粟耻,卻和暖如春查近,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挤忙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工霜威, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人册烈。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓戈泼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赏僧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子大猛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,383評(píng)論 0 5
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評(píng)論 0 10
  • [TOC] 簡(jiǎn)介: Shell 是一個(gè)用C語(yǔ)言編寫(xiě)的程序淀零,它是用戶(hù)使用Linux的橋梁挽绩。Shell既是一種命令語(yǔ)言...
    黃海濱_x閱讀 831評(píng)論 0 2
  • 特別說(shuō)明:以下內(nèi)容來(lái)自簡(jiǎn)書(shū),鏈接為原文出處驾中,一切權(quán)益歸原作者所有唉堪,在此感謝原作者的分享,大家可以點(diǎn)擊以下鏈接查看原...
    沈祥佑閱讀 559評(píng)論 0 4
  • 用了caffe有一段時(shí)間了肩民,感覺(jué)自己寫(xiě)shell腳本的能力有待提高唠亚,特地從菜鳥(niǎo)筆記處系統(tǒng)的看了一遍,其實(shí)學(xué)習(xí)基礎(chǔ)就...
    yichen_china閱讀 1,822評(píng)論 2 30