1盟广、 什么是shell?
shell是一個命令解釋器躺孝,將用戶輸入的命令解釋給操作系統(tǒng)內(nèi)核。
Shell既是一種命令語言佑力,又是一種程序設(shè)計語言式散。作為命令語言,它類似于Windows下的cmd.exe打颤,可以交互式地解釋和執(zhí)行用戶輸入的命令;作為程序設(shè)計語言编饺,它定義了各種變量和參數(shù)乖篷,并提供了許多在高級語言中才具有的控制結(jié)構(gòu),但是Shell是不需要進(jìn)行編譯的透且,它是從腳本程序中一行一行的讀取并執(zhí)行命令撕蔼。
Shell有兩種執(zhí)行命令的方式:交互式(Interactive),用戶輸入一條命令秽誊,Shell就解釋執(zhí)行一條鲸沮;批處理(Batch),用戶事先寫一個Shell腳本(Script)锅论,其中有很多條命令讼溺,讓Shell一次把這些命令執(zhí)行完,而不必一條一條地敲命令最易。
2 怒坯、常見的shell類型
Linux 的 Shell 種類眾多炫狱,常見的有:
(1) BourneShell(sh):是由AT&T Bell實驗室的 Steven Bourne為AT&T的Unix開發(fā)的,它是Unix的默認(rèn)Shell剔猿,也是其它Shell的開發(fā)基礎(chǔ)视译。Bourne Shell在編程方面相當(dāng)優(yōu)秀,但在處理與用戶的交互方面不如其它幾種Shell艳馒。
(2) BourneAgain Shell (即bash):是自由軟件基金會(GNU)開發(fā)的一個Shell憎亚,它是Linux系統(tǒng)中一個默認(rèn)的Shell。Bash不但與Bourne Shell兼容弄慰,還繼承了C Shell第美、Korn Shell等優(yōu)點。
(3) ash:ash Shell是由Kenneth Almquist編寫的陆爽,是Linux 中占用系統(tǒng)資源最少的一個小Shell什往,它只包含24個內(nèi)部命令,因而使用起來很不方便慌闭。
(4) CShell(csh):是加州伯克利大學(xué)的Bill Joy為BSD Unix開發(fā)的别威,共有52個內(nèi)部命令,與sh不同,它的語法與C語言很相似。它提供了Bourne Shell所不能處理的用戶交互特征盔性,如命令補全逼纸、命令別名、歷史命令替換等。但是,C Shell與BourneShell并不兼容。該Shell其實是指向/bin/tcsh這樣的一個Shell琳拭,也就是說,csh其實就是tcsh描验。
(5) KornShell(ksh):是AT&T Bell實驗室的David Korn開發(fā)的白嘁,共有42 條內(nèi)部命令,它集合了C Shell和Bourne Shell的優(yōu)點膘流,并且與Bourne Shell向下完全兼容絮缅。Korn Shell的效率很高,其命令交互界面和編程交互界面都很好睡扬。
(6) zch:是Linux 最大的Shell之一盟蚣,由Paul Falstad完成,共有84 個內(nèi)部命令卖怜。如果只是一般的用途屎开,沒有必要安裝這樣的Shell。
可以使用系統(tǒng)變量SHELL查看當(dāng)前使用的shell:echo $SHELL
也可以到/etc/shells文件里查看系統(tǒng)可以使用的shell
3马靠、 shell的交互方式
- 命令行
- 腳本執(zhí)行
- 編寫腳本奄抽,文件后綴名一般為.sh
- 文件必須以#!/bin/bash開頭
- 添加腳本的可執(zhí)行權(quán)限chmode +x 腳本名
- 執(zhí)行腳本:
在當(dāng)前目錄里執(zhí)行:./腳本名
-
在其他目錄中執(zhí)行:使用絕對路徑
#!/bin/bash
#使用#注釋蔼两,第一行是特殊存在
cd /
ls -al:wq #存退出盤
chmod +x 1.sh #修改權(quán)限,添加可執(zhí)行權(quán)限
./1.sh #執(zhí)行當(dāng)前目錄下的shell腳本
4、 定義變量
-
變量類型
- 局部變量:只在本shell中使用
- 環(huán)境變量 : 使用整個系統(tǒng)逞度,一般大寫
-
局部變量的使用
#1 定義局部變量
a=10 #注意等號兩邊不要留空格额划,否則會看成多個命令
b=$a#2顯示局部變量
echo
echo "a=$a" #雙引號中的變量解釋#3.銷毀變量
unset a #干掉一個變量档泽,不要帶$符
#注意反引號俊戳,反引號引起來的是命令,可以執(zhí)行馆匿,將執(zhí)行結(jié)果給變量
d=`date`【注】:等號兩邊不要留空格
-
位置變量
$0 表示腳本的名稱
$1-$9表示傳遞給腳本的的參數(shù)#test.sh腳本
#!/bin/bash
echo 'hello world'
echo $0 $1 $2執(zhí)行輸出:
hello world
./test.sh lala dudu 特殊變量
$#表示傳遞給腳本的參數(shù)個數(shù)
$*表示傳遞給腳本的所有參數(shù)
$?表示上一個命令執(zhí)行的返回值抑胎,返回值為0表示成功執(zhí)行,否則命令執(zhí)行錯誤常量
readonly a=10 #定義常量
echo $a
a='ll' #-bash: name: 只讀變量,不能修改
5 引號
- 雙引號中解釋變量渐北,解釋轉(zhuǎn)義字符
- 單引號不解釋變量阿逃、不解釋轉(zhuǎn)義字符
- 反引號會執(zhí)行當(dāng)中的內(nèi)容
- 特殊字符要用反斜線轉(zhuǎn)義:& * ?| $ ^
6 字符串
- 計算字符串長度${#字符串名}
- 提取子串:${字符串名:start:len}從下標(biāo)為start開始赃蛛,提取len個字符
7 數(shù)組
- 數(shù)組定義:a=(1 2 3) #千萬注意恃锉,數(shù)值之間用空格分隔
- 獲取數(shù)組元素:${a[0]}
- 賦值$a[0]=100
- 獲取數(shù)組長度:{#a[@]}或者{#a[*]}
8 seq
- 生成連續(xù)整數(shù)
- 示例:seq 1 10,生成1-10的連續(xù)整數(shù)
9 運算
-
數(shù)學(xué)運算
shell默認(rèn)所有變量都是字符串,執(zhí)行數(shù)學(xué)計算需要用[]括起來
a=100
echo $[$a+10]
echo $[$a/2]
echo $[$a*2]
echo $[$a-80]
echo $[10%2]
echo $((3+5))
echo $((10/2))
echo $((10/3)) # 整除
echo $((10*3))
echo $((10%3))
let a=5+6
echo $a
let a+=10
echo $a
echo `expr 3 + 5` #也可以用expr進(jìn)行計算
- 關(guān)系運算
運算符 | 說明 | 舉例 |
---|---|---|
-eq | ==呕臂,相等返回 true破托。 | [ a -eq b ] |
-ne | !=,不相等返回 true歧蒋。 | [ a -ne b ] |
-gt | >炼团,如果是,則返回 true疏尿。 | [ a -gt b ] |
-lt | <,如果是易桃,則返回 true褥琐。 | [ a -lt b ] |
-ge | >=,如果是晤郑,則返回 true敌呈。 | [ a -ge b ] |
-le | <=,如果是造寝,則返回 true磕洪。 | [ a -le b ] |
- 邏輯運算
運算符 | 說明 | 舉例 |
---|---|---|
&& | 邏輯的 AND | [[ a -lt 100 && b -gt 100 ]] 返回 false |
|| | 邏輯的 OR | [[ a -lt 100 || b -gt 100 ]] 返回 true |
- 字符串判斷
運算符 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字符串是否相等,相等返回 true诫龙。 | [ a = b ] 返回 false析显。 |
!= | 檢測兩個字符串是否相等,不相等返回 true签赃。 | [ a != b ] 返回 true谷异。 |
-z | 檢測字符串長度是否為0分尸,為0返回 true。 | [ -z $a ] 返回 false歹嘹。 |
str | 檢測字符串是否為空箩绍,不為空返回 true。 | [ $a ] 返回 true尺上。 |
- 文件判斷
操作符 | 說明 | 舉例 |
---|---|---|
-d file | 檢測文件是否是目錄材蛛,如果是,則返回 true怎抛。 | [ -d $file ] 返回 false卑吭。 |
-f file | 檢測文件是否是普通文件(既不是目錄,也不是設(shè)備文件)抽诉,如果是陨簇,則返回 true。 | [ -f $file ] 返回 true迹淌。 |
-r file | 檢測文件是否可讀河绽,如果是,則返回 true唉窃。 | [ -r $file ] 返回 true耙饰。 |
-w file | 檢測文件是否可寫,如果是纹份,則返回 true苟跪。 | [ -w $file ] 返回 true。 |
-x file | 檢測文件是否可執(zhí)行蔓涧,如果是件已,則返回 true。 | [ -x $file ] 返回 true元暴。 |
-s file | 檢測文件是否不為空(文件大小是否大于0)篷扩,不為空返回 true。 | [ -s $file ] 返回 true茉盏。 |
-e file | 檢測文件(包括目錄)是否存在鉴未,如果是,則返回 true鸠姨。 | [ -e $file ] 返回 true铜秆。 |
10 分支語句
- if-else
a=100
if [ $a -gt 90 ]
then
echo "a>90"
else
echo "a<=90"
fi
- case
case $變量名 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默認(rèn)執(zhí)行的命令序列
;;
esac
1 #!/bin/bash
2 case $1 in
3 start | begin)
4 echo "start"
5 ;;
6 stop | end)
7 echo "stop"
8 ;;
9 *)
10 echo "I don't know"
11 esac
11 循環(huán)語句
-forin
for 變量 in 列表
do
command1
command2
...
commandN
done
示例:
for i in 1 2 3 4 5;do
echo $i
done
#從命令讀取值
for line in `cat 1.txt`;do
echo $line
done
#讀取目錄列表
for file in ~/*;do
echo $file;
done
for i in `seq 1 100`;do
let sum+=$i
done
#遍歷數(shù)組
for x in ${a[*]};do
echo $x;
done
- while
#當(dāng)型循環(huán)
while condition
do
command
done
sum=0
i=0
while [ $i -lt 10];do
let sum+=$i
let i+=1
done
- until
#直到型循環(huán)
#condition為假執(zhí)行循環(huán),為真停止
until condition
do
command
done
until [ ! $i -lt 10 ];do
echo $i;
let i+=1;
done
12 break和continue
break 退出當(dāng)前循環(huán)
continue 結(jié)束當(dāng)次循環(huán)
13 函數(shù)
- 函數(shù)必須先定義后使用
#函數(shù)定義
test()
{
echo "簡單函數(shù)"
}
#函數(shù)調(diào)用
test()