一篇文章學懂Shell腳本,最簡明的教程在這裏

Shell腳本,就是利用Shell的命令解釋的功能,對一個純文本的文件進行解析,而後執行這些功能,也能夠說Shell腳本就是一系列命令的集合。
Shell能夠直接使用在win/Unix/Linux上面,而且能夠調用大量系統內部的功能來解釋執行程序,若是熟練掌握Shell腳本,可讓咱們操做計算機變得更加輕鬆,也會節省不少時間。git

Shell應用場景

Shell能作什麼

  • 將一些複雜的命令簡單化(平時咱們提交一次github代碼可能須要不少步驟,可是能夠用Shell簡化成一步)
  • 能夠寫一些腳本自動實現一個工程中自動更換最新的sdk(庫)
  • 自動打包、編譯、發佈等功能
  • 清理磁盤中空文件夾
  • 總之一切有規律的活腳本均可以嘗試一下

Shell不能作什麼

  • 須要精密的運算的時候
  • 須要語言效率很高的時候
  • 須要一些網絡操做的時候
  • 總之Shell就是能夠快速開發一個腳本簡化開發流程,並不能夠用來替代高級語言

Shell的工做原理

Shell能夠被稱做是腳本語言,由於它自己是不須要編譯的,而是經過解釋器解釋以後再編譯執行,和傳統語言相比多瞭解釋的過程因此效率會略差於傳統的直接編譯的語言。github


最簡單的腳本:

#!/bin/bash echo "Hello World" 

只須要打開文本編輯工具,編輯成以上的樣子,而後保存成test.sh數組

運行該腳本:

1. cd 到該目錄下 2. chmod +x ./test.sh #給腳本權限 3. ./test.sh #執行腳本 
 
效果圖1

這樣咱們便寫出來了第一個最簡單的腳本,下面咱們能夠嘗試着寫一些複雜的腳本。ruby


Shell中的變量

myText="hello world" muNum=100 

這裏面須要注意的就是,「=」先後不能有空格,命名規則就和其它語言同樣了。bash

訪問變量

myText="hello world" muNum=100 echo $myText echo muNum 

當想要訪問變量的時候,須要使用$,不然輸出的將是純文本內容,以下圖所示。網絡

 
效果圖2

Shell中的四則運算

運算符 含義
+ 加法運算
- 減法運算
* 乘法運算
/ 除法運算

例子程序

#!/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" 

這裏面須要注意的就是,定義變量的時候「=」先後是不能有空格的,可是進行四則運算的時候運算符號先後必定要有空格,乘法的時候須要進行轉義。less

 
效果圖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 

定義一個沒有返回值的函數,而後調用該函數ui

#!/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
相關文章
相關標籤/搜索