歡迎光臨
每天分享高質量文章

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

作者:關瑋琳linSir

鏈接:https://www.jianshu.com/p/71cb62f08768


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 ]
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  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 ]
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 #獲取輸入流


寫一個自動輸入命令的腳本


自動提交github倉庫的腳本


#!/bin/bash
echo "-------Begin-------"
git add .
git commit -m $1
echo $1
git push origin master
echo "--------End--------"

效果圖13


編號619,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

Web開發

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

赞(0)

分享創造快樂