一篇文章讓你入門Shell !

Shell腳本,就是利用Shell的命令解釋的功能,對一個純文本的文件進行解析,而後執行這些功能,也能夠說Shell腳本就是一系列命令的集合。git

Shell能夠直接使用在win/Unix/Linux上面,而且能夠調用大量系統內部的功能來解釋執行程序,若是熟練掌握Shell腳本,可讓咱們操做計算機變得更加輕鬆,也會節省不少時間。github

Shell應用場景

Shell能作什麼

  • 將一些複雜的命令簡單化(平時咱們提交一次github代碼可能須要不少步驟,可是能夠用Shell簡化成一步)數組

  • 能夠寫一些腳本自動實現一個工程中自動更換最新的sdk(庫)bash

  • 自動打包、編譯、發佈等功能網絡

  • 清理磁盤中空文件夾less

  • 總之一切有規律的活腳本均可以嘗試一下函數

Shell不能作什麼

  • 須要精密的運算的時候工具

  • 須要語言效率很高的時候spa

  • 須要一些網絡操做的時候code

  • 總之Shell就是能夠快速開發一個腳本簡化開發流程,並不能夠用來替代高級語言

Shell的工做原理

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

如何運行Shell腳本

最簡單的腳本

#!/bin/bash
echo"Hello World"

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

運行該腳本

  1. cd到該目錄下

  2. chmod +x ./test.sh #給腳本權限

  3. ./test.sh #執行腳本

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

變量

Shell中的變量

myText= "hello world"
muNum= 100

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

訪問變量

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

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

符號和運算

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"

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

其它運算符 =、==、!=、!、-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

關係運算符
運算符 含義
-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

輸出程序

echo

#!/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 命令的語法:

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 ,else,if else,case

  • 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命令

test$[num1] -eq $[num2] #判斷兩個變量是否相等

testnum1=num2 #判斷兩個數字是否相等

參數 含義
-e file 文件存在則返回真
-r file 文件存在而且可讀則返回真
-w file 文件存在而且可寫則返回真
-x file 文件存在而且可執行則返回真
-s file 文件存在而且內容不爲空則返回真
-d file 文件目錄存在則返回真

循環

for循環

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

while循環

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

寫一個自動輸入命令的腳本,自動提交github倉庫的腳本

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

相關文章
相關標籤/搜索