快速入門大廠後端面試必備的 Shell 編程

一文帶你簡單入門 Shell 編程!

目錄

Shell 編程入門走進 Shell 編程的大門為什麼要學Shell?什麼是 Shell?Shell 編程的 Hello WorldShell 變量Shell 編程中的變量介紹Shell 字符串入門Shell 字符串常見操作Shell 數組Shell 基本運算符算數運算符關係運算符邏輯運算符布爾運算符字符串運算符文件相關運算符shell流程控制if 條件語句for 循環語句while 語句shell 函數不帶參數沒有返回值的函數有返回值的函數帶參數的函數

Shell 編程入門

走進 Shell 編程的大門

為什麼要學Shell?

學一個東西,我們大部分情況都是往實用性方向著想。從工作角度來講,學習 Shell 是為了提高我們自己工作效率,提高產出,讓我們在更少的時間完成更多的事情。

很多人會說 Shell 編程屬於運維方面的知識了,應該是運維人員來做,我們做後端開發的沒必要學。我覺得這種說法大錯特錯,相比於專門做Linux運維的人員來說,我們對 Shell 編程掌握程度的要求要比他們低,但是shell編程也是我們必須要掌握的!

目前Linux系統下最流行的運維自動化語言就是Shell和Python了。

兩者之間,Shell幾乎是IT企業必須使用的運維自動化編程語言,特別是在運維工作中的服務監控、業務快速部署、服務啟動停止、數據備份及處理、日製分析等環節裡,shell是不可缺的。Python 更適合處理複雜的業務邏輯,以及開發複雜的運維軟件工具,實現通過web訪問等。Shell是一個命令解釋器,解釋執行用戶所輸入的命令和程序。一輸入命令,就立即回應的交互的對話方式。

另外,瞭解 shell 編程也是大部分互聯網公司招聘後端開發人員的要求。下圖是我截取的一些知名互聯網公司對於 Shell 編程的要求。

快速入門大廠後端面試必備的 Shell 編程

什麼是 Shell?

簡單來說“Shell編程就是對一堆Linux命令的邏輯化處理”。

W3Cschool 上的一篇文章是這樣介紹 Shell的,如下圖所示。

快速入門大廠後端面試必備的 Shell 編程

Shell 編程的 Hello World

學習任何一門編程語言第一件事就是輸出HelloWord了!下面我會從新建文件到shell代碼編寫來說下Shell 編程如何輸出Hello World。

(1)新建一個文件 helloworld.sh : touch helloworld.sh,擴展名為 sh(sh代表Shell)(擴展名並不影響腳本執行,見名知意就好,如果你用 php 寫 shell 腳本,擴展名就用 php 好了)

(2) 使腳本具有執行權限: chmod+x helloworld.sh

(3) 使用 vim 命令修改helloworld.sh文件: vim helloworld.sh(vim 文件------>進入文件----->命令模式------>按i進入編輯模式----->編輯文件 ------->按Esc進入底行模式----->輸入:wq/q! (輸入wq代表寫入內容並退出,即保存;輸入q!代表強制退出不保存。))

helloworld.sh 內容如下:


#!/bin/bash
#第一個shell小程序,echo 是linux中的輸出命令。
echo "helloworld!"

shell中 # 符號表示註釋。shell 的第一行比較特殊,一般都會以#!開始來指定使用的 shell 類型。在linux中,除了bash shell以外,還有很多版本的shell, 例如zsh、dash等等...不過bash shell還是我們使用最多的。

(4) 運行腳本: ./helloworld.sh 。(注意,一定要寫成 ./helloworld.sh ,而不是 helloworld.sh ,運行其它二進制的程序也一樣,直接寫 helloworld.sh ,linux 系統會去 PATH 裡尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 裡,你的當前目錄通常不在 PATH 裡,所以寫成 helloworld.sh 是會找不到命令的,要用 ./helloworld.sh 告訴系統說,就在當前目錄找。)

快速入門大廠後端面試必備的 Shell 編程

Shell 變量

Shell 編程中的變量介紹

Shell編程中一般分為三種變量:

  1. 我們自己定義的變量(自定義變量): 僅在當前 Shell 實例中有效,其他 Shell 啟動的程序不能訪問局部變量。
  2. Linux已定義的環境變量(環境變量, 例如:$PATH, $HOME 等..., 這類變量我們可以直接使用),使用 env 命令可以查看所有的環境變量,而set命令既可以查看環境變量也可以查看自定義變量。
  3. Shell變量 :Shell變量是由 Shell 程序設置的特殊變量。Shell 變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了 Shell 的正常運行

常用的環境變量:

PATH 決定了shell將到哪些目錄中尋找命令或程序 HOME 當前用戶主目錄 HISTSIZE 歷史記錄數 LOGNAME 當前用戶的登錄名 HOSTNAME 指主機的名稱 SHELL 當前用戶Shell類型 LANGUGE 語言相關的環境變量,多語言可以修改此環境變量 MAIL 當前用戶的郵件存放目錄 PS1 基本提示符,對於root用戶是#,對於普通用戶是$

使用 Linux 已定義的環境變量:

比如我們要看當前用戶目錄可以使用: echo $HOME命令;如果我們要看當前用戶Shell類型 可以使用 echo $SHELL命令。可以看出,使用方法非常簡單。

使用自己定義的變量:


#!/bin/bash
#自定義變量hello
hello="hello world"
echo $hello
echo "helloworld!"
快速入門大廠後端面試必備的 Shell 編程

Shell 編程中的變量名的命名的注意事項:

  • 命名只能使用英文字母,數字和下劃線,首個字符不能以數字開頭,但是可以使用下劃線(_)開頭。
  • 中間不能有空格,可以使用下劃線(_)。
  • 不能使用標點符號。
  • 不能使用bash裡的關鍵字(可用help命令查看保留關鍵字)。

Shell 字符串入門

字符串是shell編程中最常用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),字符串可以用單引號,也可以用雙引號。這點和Java中有所不同。

單引號字符串:

#!/bin/bash

name='SnailClimb'

hello='Hello, I am '$name'!'

echo $hello

輸出內容:

Hello, I am SnailClimb!

雙引號字符串:


#!/bin/bash
name='SnailClimb'
hello="Hello, I am "$name"!"
echo $hello

輸出內容:

Hello, I am SnailClimb!

Shell 字符串常見操作

拼接字符串:

#!/bin/bash

name="SnailClimb"

# 使用雙引號拼接

greeting="hello, "$name" !"

greeting_1="hello, ${name} !"

echo $greeting $greeting_1

# 使用單引號拼接

greeting_2='hello, '$name' !'

greeting_3='hello, ${name} !'

echo $greeting_2 $greeting_3

輸出結果:

快速入門大廠後端面試必備的 Shell 編程

獲取字符串長度:


#!/bin/bash
#獲取字符串長度
name="SnailClimb"
# 第一種方式
echo ${#name} #輸出 10
# 第二種方式
expr length "$name";

輸出結果:


10
10

使用 expr 命令時,表達式中的運算符左右必須包含空格,如果不包含空格,將會輸出表達式本身:


expr 5+6 // 直接輸出 5+6
expr 5 + 6 // 輸出 11

對於某些運算符,還需要我們使用符號""進行轉義,否則就會提示語法錯誤。


expr 5 * 6 // 輸出錯誤
expr 5 \* 6 // 輸出30

截取子字符串:

簡單的字符串截取:

#從字符串第 1 個字符開始往後截取 10 個字符

str="SnailClimb is a great man"

echo ${str:0:10} #輸出:SnailClimb

根據表達式截取:


#!bin/bash
#author:amau
var="http://www.runoob.com/linux/linux-shell-variable.html"
s1=${var%%t*}#h

s2=${var%t*}#http://www.runoob.com/linux/linux-shell-variable.h
s3=${var%%.*}#http://www
s4=${var#*/}#/www.runoob.com/linux/linux-shell-variable.html
s5=${var##*/}#linux-shell-variable.html

Shell 數組

bash支持一維數組(不支持多維數組),並且沒有限定數組的大小。我下面給了大家一個關於數組操作的 Shell 代碼示例,通過該示例大家可以知道如何創建數組、獲取數組長度、獲取/刪除特定位置的數組元素、刪除整個數組以及遍歷數組。

#!/bin/bash

array=(1 2 3 4 5);

# 獲取數組長度

length=${#array[@]}

# 或者

length2=${#array[*]}

#輸出數組長度

echo $length #輸出:5

echo $length2 #輸出:5

# 輸出數組第三個元素

echo ${array[2]} #輸出:3

unset array[1]# 刪除下表為1的元素也就是刪除第二個元素

for i in ${array[@]};do echo $i ;done # 遍歷數組,輸出: 1 3 4 5

unset arr_number; # 刪除數組中的所有元素

for i in ${array[@]};do echo $i ;done # 遍歷數組,數組元素為空,沒有任何輸出內容

Shell 基本運算符

說明:圖片來自《菜鳥教程》

Shell 編程支持下面幾種運算符

  • 算數運算符
  • 關係運算符
  • 布爾運算符
  • 字符串運算符
  • 文件測試運算符

算數運算符

快速入門大廠後端面試必備的 Shell 編程

我以加法運算符做一個簡單的示例:

#!/bin/bash

a=3;b=3;

val=`expr $a + $b`

#輸出:Total value : 6

echo "Total value : $val

關係運算符

關係運算符只支持數字,不支持字符串,除非字符串的值是數字。

快速入門大廠後端面試必備的 Shell 編程

通過一個簡單的示例演示關係運算符的使用,下面shell程序的作用是當score=100的時候輸出A否則輸出B。

#!/bin/bash

score=90;

maxscore=100;

if [ $score -eq $maxscore ]

then

echo "A"

else

echo "B"

fi

輸出結果:

B

邏輯運算符

快速入門大廠後端面試必備的 Shell 編程

示例:

#!/bin/bash

a=$(( 1 && 0))

# 輸出:0;邏輯與運算只有相與的兩邊都是1,與的結果才是1;否則與的結果是0

echo $a;

布爾運算符

快速入門大廠後端面試必備的 Shell 編程

這裡就不做演示了,應該挺簡單的。

字符串運算符

快速入門大廠後端面試必備的 Shell 編程

簡單示例:


#!/bin/bash
a="abc";
b="efg";
if [ $a = $b ]
then
echo "a 等於 b"
else
echo "a 不等於 b"
fi

輸出:

a 不等於 b

文件相關運算符

快速入門大廠後端面試必備的 Shell 編程

使用方式很簡單,比如我們定義好了一個文件路徑 file="/usr/learnshell/test.sh"如果我們想判斷這個文件是否可讀,可以這樣 if[-r $file] 如果想判斷這個文件是否可寫,可以這樣 -w $file,是不是很簡單。

shell流程控制

if 條件語句

簡單的 if else-if else 的條件語句示例


#!/bin/bash
a=3;
b=9;
if [ $a = $b ]
then
echo "a 等於 b"
elif [ $a > $b ]
then
echo "a 大於 b"
else
echo "a 小於 b"
fi

輸出結果:


a 大於 b

相信大家通過上面的示例就已經掌握了 shell 編程中的 if 條件語句。不過,還要提到的一點是,不同於我們常見的 Java 以及 PHP 中的 if 條件語句,shell if 條件語句中不能包含空語句也就是什麼都不做的語句。

for 循環語句

通過下面三個簡單的示例認識 for 循環語句最基本的使用,實際上 for 循環語句的功能比下面你看到的示例展現的要大得多。

輸出當前列表中的數據:

 

for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done

產生 10 個隨機數:


#!/bin/bash
for i in {0..9};
do
echo $RANDOM;
done

輸出1到5:

通常情況下 shell 變量調用需要加 $,但是 for 的 (()) 中不需要,下面來看一個例子:


#!/bin/bash
for((i=1;i<=5;i++));do
echo $i;
done;

while 語句

基本的 while 循環語句:


#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done

while循環可用於讀取鍵盤信息:

echo '按下 退出'

echo -n '輸入你最喜歡的電影: '

while read FILM

do

echo "是的!$FILM 是一個好電影"

done

輸出內容:

按下 退出

輸入你最喜歡的電影: 變形金剛

是的!變形金剛 是一個好電影

無線循環:


while true
do
command
done

shell 函數

不帶參數沒有返回值的函數


#!/bin/bash
function(){
echo "這是我的第一個 shell 函數!"
}
function

輸出結果:

這是我的第一個 shell 函數!

有返回值的函數

輸入兩個數字之後相加並返回結果:

#!/bin/bash

funWithReturn(){

echo "輸入第一個數字: "

read aNum

echo "輸入第二個數字: "

read anotherNum

echo "兩個數字分別為 $aNum 和 $anotherNum !"

return $(($aNum+$anotherNum))

}

funWithReturn

echo "輸入的兩個數字之和為 $?"

輸出結果:

輸入第一個數字:

1

輸入第二個數字:

2

兩個數字分別為 1 和 2 !

輸入的兩個數字之和為 3

帶參數的函數

#!/bin/bash

funWithParam(){

echo "第一個參數為 $1 !"

echo "第二個參數為 $2 !"

echo "第十個參數為 $10 !"

echo "第十個參數為 ${10} !"

echo "第十一個參數為 ${11} !"

echo "參數總數有 $# 個!"

echo "作為一個字符串輸出所有參數 $* !"

}

funWithParam 1 2 3 4 5 6 7 8 9 34 73

輸出結果:


第一個參數為 1 !

第二個參數為 2 !
第十個參數為 10 !
第十個參數為 34 !
第十一個參數為 73 !
參數總數有 11 個!
作為一個字符串輸出所有參數 1 2 3 4 5 6 7 8 9 34 73 !


分享到:


相關文章: