Shell腳本,就是利用Shell的命令解釋的功能,對一個(gè)純文本的文件進(jìn)行解析,然后執(zhí)行這些功能,也可以說Shell腳本就是一系列命令的集合。
Shell可以直接使用在win/Unix/Linux上面,并且可以調(diào)用大量系統(tǒng)內(nèi)部的功能來解釋執(zhí)行程序,如果熟練掌握Shell腳本,可以讓我們操作計(jì)算機(jī)變得更加輕松,也會(huì)節(jié)省很多時(shí)間。
Shell應(yīng)用場景
Shell能做什么
- 將一些復(fù)雜的命令簡單化(平時(shí)我們提交一次github代碼可能需要很多步驟,但是可以用Shell簡化成一步)
- 可以寫一些腳本自動(dòng)實(shí)現(xiàn)一個(gè)工程中自動(dòng)更換最新的sdk(庫)
- 自動(dòng)打包、編譯、發(fā)布等功能
- 清理磁盤中空文件夾
- 總之一切有規(guī)律的活腳本都可以嘗試一下
Shell不能做什么
- 需要精密的運(yùn)算的時(shí)候
- 需要語言效率很高的時(shí)候
- 需要一些網(wǎng)絡(luò)操作的時(shí)候
- 總之Shell就是可以快速開發(fā)一個(gè)腳本簡化開發(fā)流程,并不可以用來替代高級語言
Shell的工作原理
Shell可以被稱作是腳本語言,因?yàn)樗旧硎遣恍枰幾g的,而是通過解釋器解釋之后再編譯執(zhí)行,和傳統(tǒng)語言相比多了解釋的過程所以效率會(huì)略差于傳統(tǒng)的直接編譯的語言。
最簡單的腳本:
#!/bin/bash
echo "Hello World"
只需要打開文本編輯工具,編輯成以上的樣子,然后保存成test.sh
運(yùn)行該腳本:
1. cd 到該目錄下
2. chmod +x ./test.sh #給腳本權(quán)限
3. ./test.sh #執(zhí)行腳本

這樣我們便寫出來了第一個(gè)最簡單的腳本,下面我們可以嘗試著寫一些復(fù)雜的腳本。
Shell中的變量
myText="hello world"
muNum=100
這里面需要注意的就是,“=”前后不能有空格,命名規(guī)則就和其它語言一樣了。
訪問變量
myText="hello world"
muNum=100
echo $myText
echo muNum
當(dāng)想要訪問變量的時(shí)候,需要使用$,否則輸出的將是純文本內(nèi)容,如下圖所示。

Shell中的四則運(yùn)算
| 運(yùn)算符 | 含義 |
|---|---|
| + | 加法運(yùn)算 |
| - | 減法運(yùn)算 |
| * | 乘法運(yùn)算 |
| / | 除法運(yùn)算 |
例子程序
#!/bin/bash
echo "Hello World !"
a=3
b=5
val=`expr $a + $b`
echo "Total value : $val"
val=`expr $a - $b`
echo "Total value : $val"
val=`expr $a \* $b`
echo "Total value : $val"
val=`expr $a / $b`
echo "Total value : $val"
這里面需要注意的就是,定義變量的時(shí)候“=”前后是不能有空格的,但是進(jìn)行四則運(yùn)算的時(shí)候運(yùn)算符號前后一定要有空格,乘法的時(shí)候需要進(jìn)行轉(zhuǎn)義。

其它運(yùn)算符 =、==、!=、!、-o、-a
| 運(yùn)算符 | 含義 |
|---|---|
| % | 求余 |
| == | 相等 |
| = | 賦值 |
| != | 不相等 |
| ! | 非 |
| -o | 或 |
| -a | 與 |
例子程序
a=3
b=5
val=`expr $a / $b`
echo "Total value : $val"
val=`expr $a % $b`
echo "Total value : $val"
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi

關(guān)系運(yùn)算符
| 運(yùn)算符 | 含義 |
|---|---|
| -eq | 兩個(gè)數(shù)相等返回true |
| -ne | 兩個(gè)數(shù)不相等返回true |
| -gt | 左側(cè)數(shù)大于右側(cè)數(shù)返回true |
| -It | 左側(cè)數(shù)小于右側(cè)數(shù)返回true |
| -ge | 左側(cè)數(shù)大于等于右側(cè)數(shù)返回true |
| -le | 左側(cè)數(shù)小于等于右側(cè)數(shù)返回true |
例子程序
#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -ne $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -gt $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -lt $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -ge $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -le $b ]
then
echo "true"
else
echo "false"
fi

字符串運(yùn)算符
| 運(yùn)算符 | 含義 |
|---|---|
| = | 兩個(gè)字符串相等返回true |
| != | 兩個(gè)字符串不相等返回true |
| -z | 字符串長度為0返回true |
| -n | 字符串長度不為0返回true |
| 運(yùn)算符 | 含義 |
|---|---|
| -d file | 檢測文件是否是目錄,如果是,則返回 true |
| -r file | 檢測文件是否可讀,如果是,則返回 true |
| -w file | 檢測文件是否可寫,如果是,則返回 true |
| -x file | 檢測文件是否可執(zhí)行,如果是,則返回 true |
| -s file | 檢測文件是否為空(文件大小是否大于0,不為空返回 true |
| -e file | 檢測文件(包括目錄)是否存在,如果是,則返回 true |
字符串
#!/bin/sh
mtext="hello" #定義字符串
mtext2="world"
mtext3=$mtext" "$mtext2 #字符串的拼接
echo $mtext3 #輸出字符串
echo ${#mtext3} #輸出字符串長度
echo ${mtext3:1:4} #截取字符串

數(shù)組
#!/bin/sh
array=(1 2 3 4 5) #定義數(shù)組
array2=(aa bb cc dd ee) #定義數(shù)組
value=${array[3]} #找到某一個(gè)下標(biāo)的數(shù),然后賦值
echo $value #打印
value2=${array2[3]} #找到某一個(gè)下標(biāo)的數(shù),然后賦值
echo $value2 #打印
length=${#array[*]} #獲取數(shù)組長度
echo $length

輸出程序
echo
#!/bin/sh
echo "hello world"
echo hello world
text="hello world"
echo $text
echo -e "hello \nworld" #輸出并且換行
echo "hello world" > a.txt #重定向到文件
echo `date` #輸出當(dāng)前系統(tǒng)時(shí)間

printf
同c語言,就不過多介紹了
判斷語句
- if
- if-else
- if-elseIf
- case
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "true"
fi
if [ $a == $b ]
then
echo "true"
else
echo "false"
fi
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater than b"
elif [ $a -lt $b ]
then
echo "a is less than b"
else
echo "None of the condition met"
fi

test命令
test $[num1] -eq $[num2] #判斷兩個(gè)變量是否相等
test num1=num2 #判斷兩個(gè)數(shù)字是否相等
| 參數(shù) | 含義 |
|---|---|
| -e file | 文件存在則返回真 |
| -r file | 文件存在并且可讀則返回真 |
| -w file | 文件存在并且可寫則返回真 |
| -x file | 文件存在并且可執(zhí)行則返回真 |
| -s file | 文件存在并且內(nèi)容不為空則返回真 |
| -d file | 文件目錄存在則返回真 |
for循環(huán)
#!/bin/sh
for i in {1..5}
do
echo $i
done
for i in 5 6 7 8 9
do
echo $i
done
for FILE in $HOME/.bash*
do
echo $FILE
done

while循環(huán)
#!/bin/sh
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER=`expr $COUNTER + 1`
echo $COUNTER
done
echo '請輸入。。。'
echo 'ctrl + d 即可停止該程序'
while read FILM
do
echo "Yeah! great film the $FILM"
done
以上是while循環(huán)的兩種用法,第一種是比較常規(guī)的,執(zhí)行循環(huán),然后每次都把控制的數(shù)加1,就可以讓while循環(huán)有退出的條件了。
第二種是用戶從鍵盤數(shù)據(jù),然后把用戶輸入的文字輸出出來。
跳出循環(huán)
break #跳出所有循環(huán)
break n #跳出第n層f循環(huán)
continue #跳出當(dāng)前循環(huán)
函數(shù)
#!/bin/sh
sysout(){
echo "hello world"
}
sysout
定義一個(gè)沒有返回值的函數(shù),然后調(diào)用該函數(shù)
#!/bin/sh
test(){
aNum=3
anotherNum=5
return $(($aNum+$anotherNum))
}
test
result=$?
echo $result
定義一個(gè)有返回值的函數(shù),調(diào)用該函數(shù),輸出結(jié)果

#!/bin/sh
test(){
echo $1 #接收第一個(gè)參數(shù)
echo $2 #接收第二個(gè)參數(shù)
echo $3 #接收第三個(gè)參數(shù)
echo $# #接收到參數(shù)的個(gè)數(shù)
echo $* #接收到的所有參數(shù)
}
test aa bb cc
定義了一個(gè)需要傳遞參數(shù)的函數(shù)

重定向
$echo result > file #將結(jié)果寫入文件,結(jié)果不會(huì)在控制臺展示,而是在文件中,覆蓋寫
$echo result >> file #將結(jié)果寫入文件,結(jié)果不會(huì)在控制臺展示,而是在文件中,追加寫
echo input < file #獲取輸入流
寫一個(gè)自動(dòng)輸入命令的腳本
自動(dòng)提交github倉庫的腳本
#!/bin/bash
echo "-------Begin-------"
git add .
git commit -m $1
echo $1
git push origin master
echo "--------End--------"

以上便是我對shell知識的總結(jié),歡迎大家點(diǎn)心,評論,一起討論~~