一篇文章學懂Shell腳本

来源:http://www.cnblogs.com/huanongying/archive/2017/06/18/7043728.html
-Advertisement-
Play Games

Shell腳本,就是利用Shell的命令解釋的功能,對一個純文本的文件進行解析,然後執行這些功能,也可以說Shell腳本就是一系列命令的集合。Shell可以直接使用在win/Unix/Linux上面,並且可以調用大量系統內部的功能來解釋執行程式,如果熟練掌握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

例子程式

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

關係運算符

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

字元串運算符





字元串

#!/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  #判斷兩個數字是否相等

 

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

以上便是我對shell知識的總結,歡迎大家點心,評論,一起討論~~

 腳本程式
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文出處:Increased SOS_SCHEDULER_YIELD waits on virtual machines 註: 原文的用詞是Increased,想譯作增強(增長),或者加強,這麼譯起來是褒義詞,而原文要表達的Increased並沒有褒義的含義,最起碼是一個中性的含義,想來想起用一個“ ...
  • could not start the service MySQL .error 0 安裝時無法啟動服務 在MySQL資料庫卸載後重裝時,一定要將MySQL的相關服務,文件夾,註冊表刪除徹底 1.打開service.msc關閉MySQL服務 2.控制面板 -> 程式和功能 -> MYSQL 雙擊卸載 ...
  • 我們以Oracle自帶的表來做例子 主要兩張表:dept、emp 一個是部門,一個是員工表結構如下: emp name null? Type Empno not null number(4) ename varchar2(10) job varchar2(9) mgr number(4) hired ...
  • MySQL授權命令grant的使用方法:grant 許可權 on 資料庫對象 to 用戶 ...
  • 我們使用資料庫的時候,如果查詢條件太複雜,則會涉及到很多問題 1、無法維護,各種嵌套查詢,各種複雜的查詢,想要優化都無從下手 2、效率低下,一般語句複雜了之後,比如使用or,like %,,%查詢之後資料庫的索引就沒有辦法利用到了,這個時候的搜索就會全表掃描,數據量少的時候可能性能還能接受,但是數據 ...
  • 1.安裝好jdk。 2.打開終端。 3.sudo到root帳戶,輸入 vi /etc/profile ,打開全局配置文件。 4.在profile中添加如下配置 JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/ ...
  • 在編程或是整理知識的時候一直苦於沒有一款可以幫助理清思路的工具。 在網上苦尋良久,終於找到了一款可心可意的小軟體 —— Graphviz。 折騰了一番,終於可以湊合著用了。 現將折騰的成果記錄於此以作備忘,當然如果能夠拋磚引玉那就再好不過了。 因為本人主要使用 Windows 以下將用 Window ...
  • ubuntn預設下載路徑的源是國外的下載很慢換成國內的下載路徑會好很多 在ubuntu應用搜索框(左上腳那個)中輸入software 1.software&Updates 應用點擊software 2.在彈出的界面中的download中選擇other 3.在之後彈出的框中選到china 4.在裡面選 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...