一篇文章學懂Shell指令碼,最簡明的教程在這裡
阿新 • • 發佈:2018-12-04
Shell指令碼,就是利用Shell的命令解釋的功能,對一個純文字的檔案進行解析,然後執行這些功能,也可以說Shell指令碼就是一系列命令的集合。
Shell可以直接使用在win/Unix/Linux上面,並且可以呼叫大量系統內部的功能來解釋執行程式,如果熟練掌握Shell指令碼,可以讓我們操作計算機變得更加輕鬆,也會節省很多時間。
Shell應用場景
Shell能做什麼
- 將一些複雜的命令簡單化(平時我們提交一次github程式碼可能需要很多步驟,但是可以用Shell簡化成一步)
- 可以寫一些指令碼自動實現一個工程中自動更換最新的sdk(庫)
- 自動打包、編譯、釋出等功能
- 清理磁碟中空資料夾
- 總之一切有規律的活指令碼都可以嘗試一下
Shell不能做什麼
- 需要精密的運算的時候
- 需要語言效率很高的時候
- 需要一些網路操作的時候
- 總之Shell就是可以快速開發一個指令碼簡化開發流程,並不可以用來替代高階語言
Shell的工作原理
Shell可以被稱作是指令碼語言,因為它本身是不需要編譯的,而是通過直譯器解釋之後再編譯執行,和傳統語言相比多瞭解釋的過程所以效率會略差於傳統的直接編譯的語言。
最簡單的指令碼:
#!/bin/bash
echo "Hello World"
只需要開啟文字編輯工具,編輯成以上的樣子,然後儲存成test.sh
執行該指令碼:
1. cd 到該目錄下
2. chmod +x ./test.sh #給指令碼許可權
3. ./test.sh #執行指令碼
效果圖1
這樣我們便寫出來了第一個最簡單的指令碼,下面我們可以嘗試著寫一些複雜的指令碼。
Shell中的變數
myText="hello world"
muNum=100
這裡面需要注意的就是,“=”前後不能有空格,命名規則就和其它語言一樣了。
訪問變數
myText="hello world"
muNum=100
echo $myText
echo muNum
當想要訪問變數的時候,需要使用$,否則輸出的將是純文字內容,如下圖所示。
效果圖2Shell中的四則運算
運算子 | 含義 |
---|---|
+ | 加法運算 |
- | 減法運算 |
* | 乘法運算 |
/ | 除法運算 |
例子程式
#!/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"
這裡面需要注意的就是,定義變數的時候“=”前後是不能有空格的,但是進行四則運算的時候運算子號前後一定要有空格,乘法的時候需要進行轉義。
效果圖3.png其它運算子 =、==、!=、!、-o、-a
運算子 | 含義 |
---|---|
% | 求餘 |
== | 相等 |
= | 賦值 |
!= | 不相等 |
! | 非 |
-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
效果圖4
關係運算符
運算子 | 含義 |
---|---|
-eq | 兩個數相等返回true |
-ne | 兩個數不相等返回true |
-gt | 左側數大於右側數返回true |
-It | 左側數小於右側數返回true |
-ge | 左側數大於等於右側數返回true |
-le | 左側數小於等於右側數返回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
效果圖5
字串運算子
運算子 | 含義 |
---|---|
= | 兩個字串相等返回true |
!= | 兩個字串不相等返回true |
-z | 字串長度為0返回true |
-n | 字串長度不為0返回true |
運算子 | 含義 |
---|---|
-d file | 檢測檔案是否是目錄,如果是,則返回 true |
-r file | 檢測檔案是否可讀,如果是,則返回 true |
-w file | 檢測檔案是否可寫,如果是,則返回 true |
-x file | 檢測檔案是否可執行,如果是,則返回 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} #擷取字串
效果圖6
陣列
#!/bin/sh
array=(1 2 3 4 5) #定義陣列
array2=(aa bb cc dd ee) #定義陣列
value=${array[3]} #找到某一個下標的數,然後賦值 echo $value #列印 value2=${array2[3]} #找到某一個下標的數,然後賦值 echo $value2 #列印 length=${#array[*]} #獲取陣列長度 echo $length
效果圖7
輸出程式
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` #輸出當前系統時間
效果圖8
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
效果圖9
test命令
test $[num1] -eq $[num2] #判斷兩個變數是否相等
test num1=num2 #判斷兩個數字是否相等
引數 | 含義 |
---|---|
-e file | 檔案存在則返回真 |
-r file | 檔案存在並且可讀則返回真 |
-w file | 檔案存在並且可寫則返回真 |
-x file | 檔案存在並且可執行則返回真 |
-s file | 檔案存在並且內容不為空則返回真 |
-d file | 檔案目錄存在則返回真 |
for迴圈
#!/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
效果10
while迴圈
#!/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迴圈的兩種用法,第一種是比較常規的,執行迴圈,然後每次都把控制的數加1,就可以讓while迴圈有退出的條件了。
第二種是使用者從鍵盤資料,然後把使用者輸入的文字輸出出來。
跳出迴圈
break #跳出所有迴圈
break n #跳出第n層f迴圈
continue #跳出當前迴圈
函式
#!/bin/sh
sysout(){
echo "hello world" } sysout
定義一個沒有返回值的函式,然後呼叫該函式
#!/bin/sh
test(){
aNum=3
anotherNum=5
return $(($aNum+$anotherNum)) } test result=$? echo $result
定義一個有返回值的函式,呼叫該函式,輸出結果
效果圖11#!/bin/sh
test(){
echo $1 #接收第一個引數 echo $2 #接收第二個引數 echo $3 #接收第三個引數 echo $# #接收到引數的個數 echo $* #接收到的所有引數 } test aa bb cc
定義了一個需要傳遞引數的函式
效果圖12重定向
$echo result > file #將結果寫入檔案,結果不會在控制檯展示,而是在檔案中,覆蓋寫
$echo result >> file #將結果寫入檔案,結果不會在控制檯展示,而是在檔案中,追加寫
echo input < file #獲取輸入流
寫一個自動輸入命令的指令碼
自動提交github倉庫的指令碼
#!/bin/bash
echo "-------Begin-------"
git add .
git commit -m $1
echo $1 git push origin master echo "--------End--------"
效果圖13