一篇文章学懂Shell脚本,最简明的教程在这里
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?
當想要訪問變量的時候,需要使用$,否則輸出的將是純文本內容,如下圖所示。
效果圖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"?
這里面需要注意的就是,定義變量的時候“=”前后是不能有空格的,但是進行四則運算的時候運算符號前后一定要有空格,乘法的時候需要進行轉義。
效果圖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?] thenecho?"a?is?equal?to?b" fi if?[?$a?!=?$b?] thenecho?"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?] thenecho?"true" elseecho?"false" fiif?[?$a?-ne?$b?] thenecho?"true" elseecho?"false" fiif?[?$a?-gt?$b?] thenecho?"true" elseecho?"false" fiif?[?$a?-lt?$b?] thenecho?"true" elseecho?"false" fiif?[?$a?-ge?$b?] thenecho?"true" elseecho?"false" fiif?[?$a?-le?$b?] thenecho?"true" elseecho?"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?world"??#輸出并且換行 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?] thenecho?"true" fiif?[?$a?==?$b?] thenecho?"true" elseecho?"false" fiif?[?$a?==?$b?] thenecho?"a?is?equal?to?b" elif?[?$a?-gt?$b?] thenecho?"a?is?greater?than?b" elif?[?$a?-lt?$b?] thenecho?"a?is?less?than?b" elseecho?"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/shfor?i?in?{1..5} doecho?$i donefor?i?in?5?6?7?8?9 doecho?$i donefor?FILE?in?$HOME/.bash* doecho?$FILE done?
效果圖10
?
?
while循環
?
#!/bin/sh COUNTER=0 while?[?$COUNTER?-lt?5?] doCOUNTER=`expr?$COUNTER?+?1`echo?$COUNTER doneecho?'請輸入。。。' echo?'ctrl?+?d?即可停止該程序' while?read?FILM doecho?"Yeah!?great?film?the?$FILM" done?
以上是while循環的兩種用法,第一種是比較常規的,執行循環,然后每次都把控制的數加1,就可以讓while循環有退出的條件了。第二種是用戶從鍵盤數據,然后把用戶輸入的文字輸出出來。
?
跳出循環
?
break??#跳出所有循環 break?n??#跳出第n層f循環 continue??#跳出當前循環?
?
函數
?
#!/bin/shsysout(){echo?"hello?world" }sysout?
定義一個沒有返回值的函數,然后調用該函數
?
#!/bin/shtest(){aNum=3anotherNum=5return?$(($aNum+$anotherNum)) } test result=$? echo?$result?
定義一個有返回值的函數,調用該函數,輸出結果
?
效果圖11
?
#!/bin/shtest(){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
總結
以上是生活随笔為你收集整理的一篇文章学懂Shell脚本,最简明的教程在这里的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何理解中国特色大国外交理念(如何理解中
- 下一篇: 什组词有哪些组词(什组词有哪些)