Shell腳本,就是利用Shell的命令解釋的功能,對一個純文本的文件進行解析,而後執行這些功能,也能夠說Shell腳本就是一系列命令的集合。git
Shell能夠直接使用在win/Unix/Linux上面,而且能夠調用大量系統內部的功能來解釋執行程序,若是熟練掌握Shell腳本,可讓咱們操做計算機變得更加輕鬆,也會節省不少時間。github
將一些複雜的命令簡單化(平時咱們提交一次github代碼可能須要不少步驟,可是能夠用Shell簡化成一步)數組
能夠寫一些腳本自動實現一個工程中自動更換最新的sdk(庫)bash
自動打包、編譯、發佈等功能網絡
清理磁盤中空文件夾less
總之一切有規律的活腳本均可以嘗試一下函數
須要精密的運算的時候工具
須要語言效率很高的時候spa
須要一些網絡操做的時候code
總之Shell就是能夠快速開發一個腳本簡化開發流程,並不能夠用來替代高級語言
Shell能夠被稱做是腳本語言,由於他自己是不須要編譯的,而是經過解釋器解釋以後在編譯執行,和傳統的語言相比多瞭解釋的過程,因此效率會略低於傳統的直接編譯的語言。
#!/bin/bash echo"Hello World"
只須要打開文本編輯工具,編輯成以上的樣子,而後保存成test.sh
cd到該目錄下
chmod +x ./test.sh #給腳本權限
./test.sh #執行腳本
這樣咱們便寫出來了第一個最簡單的腳本,下面咱們能夠嘗試着寫一些複雜的腳本。
myText= "hello world" muNum= 100
這裏須要注意的是,"=" 先後不能有空格,命名規則就和其餘語言同樣了。
myText= "hello world" muNum=100 echo $myText echo muNum
當你訪問變量的時候,須要使用$,不然輸出的將是純文本內容,以下圖所示:
運算符 含義 + 加法運算 - 減法運算 * 乘法運算 / 除法運算
#!/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"
這裏面須要注意的就是,定義變量的時候"="先後是不能有空格的,可是進行四則運算的時候,運算符號先後必定要有空格,乘法的時候須要進行轉義。
運算符 | 含義 |
---|---|
% | 求餘 |
== | 相等 |
= | 賦值 |
!= | 不相等 |
! | 與 |
-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
運算符 | 含義 |
---|---|
-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
運算符 | 含義 |
---|---|
= | 兩個字符串相等返回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}#截取字符串
#!/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
#!/bin/sh echo"hello world" echohello world text= "hello world" echo$text echo-e "hello world"#輸出而且換行 echo"hello world"> a.txt #重定向到文件 echo`date` #輸出當前系統時間
printf 命令的語法:
printf format-string [arguments...]
參數說明:
format-string: 爲格式控制字符串
arguments: 爲參數列表。
#!/bin/bash # format-string爲雙引號 printf "%d %s\n" 1 "abc" # 單引號與雙引號效果同樣 printf '%d %s\n' 1 "abc" # 沒有引號也能夠輸出 printf %s abcdef # 格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用 printf %s abc def printf "%s\n" abc def printf "%s %s %s\n" a b c d e f g h i j # 若是沒有 arguments,那麼 %s 用NULL代替,%d 用 0 代替 printf "%s and %d \n"
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$[num1] -eq $[num2] #判斷兩個變量是否相等
testnum1=num2 #判斷兩個數字是否相等
參數 | 含義 |
---|---|
-e file | 文件存在則返回真 |
-r file | 文件存在而且可讀則返回真 |
-w file | 文件存在而且可寫則返回真 |
-x file | 文件存在而且可執行則返回真 |
-s file | 文件存在而且內容不爲空則返回真 |
-d file | 文件目錄存在則返回真 |
#!/bin/sh fori in{1..5} do echo$i done for i in5 6 7 8 9 do echo$i done forFILE in$HOME/.bash* do echo$FILE done
#!/bin/sh COUNTER=0 while[ $COUNTER-lt 5 ] do COUNTER=`expr $COUNTER+ 1` echo$COUNTER done echo'請輸入。。。' echo'ctrl + d 便可中止該程序' whilereadFILM do echo"Yeah! great film the $FILM" done
以上是while循環的兩種用法,第一種是比較常規的,執行循環,而後每次都把控制的數加1,就可讓while循環有退出的條件了。第二種是用戶從鍵盤數據,而後把用戶輸入的文字輸出出來。
break#跳出全部循環
breakn #跳出第n層f循環
continue#跳出當前循環
#!/bin/sh sysout(){ echo"hello world" } sysout
定義一個沒有返回值的函數,而後調用該函數
#!/bin/sh test(){ aNum=3 anotherNum=5 return$(( $aNum+ $anotherNum)) } test result=$? echo$result
定義一個有返回值的函數,調用該函數,輸出結果
#!/bin/sh test(){ echo$1#接收第一個參數 echo$2#接收第二個參數 echo$3#接收第三個參數 echo$##接收到參數的個數 echo$* #接收到的全部參數 } testaa bb cc
定義了一個須要傳遞參數的函數
$echo result > file #將結果寫入文件,結果不會在控制檯展現,而是在文件中,覆蓋寫
$echo result >> file #將結果寫入文件,結果不會在控制檯展現,而是在文件中,追加寫
echo input < file #獲取輸入流
#!/bin/bash echo"-------Begin-------" git add . git commit -m $1 echo$1 git push origin master echo"--------End--------"