天天看點

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

第 1 章 SHELL 快速入門

1.1 運維

運維是什麼?

公司的技術崗位

運維的工作範圍

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

以天天生鮮項目為例:

規劃:我們需要多少資源來支援項目的運作
管理:項目運作過程中的所有内容都管理起來
流程規範:所有操作都形成制度,提高工作效率
平台:大幅度提高工作效率
監控:實時檢視項目運作狀态名額
告警:狀态名額異常,告知從業人員處理
安全:網站營運安全措施
優化:保證使用者通路網站體驗很好
考核:權責配置設定,保證利益

自動化運維:就是将圖裡面所有的工作都使用自動化的方式來實作。

實作自動化的方式很多,常見的方式:工具和腳本。

工作中常見的腳本有哪些呢?

shell腳本 和 其他開發語言腳本
注意:
shell腳本就是shell程式設計的一種具體實作

1.2 shell簡介

既然我們是來學shell,首先第一個問題:shell是什麼?

1.2.1 什麼是shell

shell的定義

在計算機科學中,Shell就是一個指令解釋器。

shell是位于作業系統和應用程式之間,是他們二者最主要的接口,shell負責把應用程式的輸入指令資訊解釋給作業系統,将作業系統指令處理後的結果解釋給應用程式。

shell位置圖

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

總結:

一句話,shell就是在作業系統和應用程式之間的一個指令翻譯工具。

1.2.2 shell的分類

基本上shell分兩大類:

圖形界面shell和指令行shell

圖形界面shell

圖形界面shell就是我們常說的桌面

指令行式shell

windows系統:
cmd.exe 指令提示字元
linux系統:
sh / csh / ksh / bash / …

我們常說的shell是指令行式的shell,在工作中常用的是linux系統下的bash。

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

檢視系統shell資訊

檢視目前系統的shell類型

echo $SHELL

檢視目前系統環境支援的shell

[[email protected] ~]# cat /etc/shells
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

1.2.3 shell 腳本

shell使用方式

手工方式:

手工敲擊鍵盤,在shell的指令行輸入指令,按Enter後,執行通過鍵盤輸入的指令,然後shell傳回并顯示指令執行的結果.
重點:逐行輸入指令、逐行進行确認執行

腳本方式:

就是說我們把手工執行的指令a,寫到一個腳本檔案b中,然後通過執行腳本b,達到執行指令a的效果.

shell腳本定義

當可執行的Linux指令或語句不在指令行狀态下執行,而是通過一個檔案執行時,我們稱檔案為shell腳本。

shell腳本示例

現在我們來使用腳本的方式來執行以下

#!/bin/bash

# 這是臨時shell腳本

echo ‘nihao’

echo ‘itcast’

腳本執行效果

[[email protected] ~]# /bin/bash itcast.sh

nihao

itcast

第 2 章 SHELL 基礎知識

2.1 shell腳本

我們在上面簡單介紹了一下什麼是shell腳本,現在我們來進一步的來介紹shell腳本的要求/格式/規範等内容

2.1.1 建立腳本

腳本建立工具:

建立腳本的常見編輯器是 vi/vim.

腳本命名

shell腳本的命名簡單來說就是要有意義,友善我們通過腳本名,來知道這個檔案是幹什麼用的。

腳本内容:

各種可以執行的指令

注釋内容:

單行注釋:

除了首行的#不是注釋外,其他所有行内容,隻要首個字元是#,那麼就表示該行是注釋
#!/bin/bash
echo ‘1’
# echo ‘2’ # 這一行就表示注釋
echo ‘3’

多行注釋:

多行注釋有兩種方法::<<! … ! 和 :<<字元 … 字元
#!/bin/bash
echo ‘1’
:<<! echo ‘2’
echo ‘3’
echo ‘4’
!
echo ‘5’

2.1.2 腳本執行

shell執行的方式

Shell腳本的執行通常可以采用以下幾種方式

bash /path/to/script-name 或 /bin/bash /path/to/script-name (強烈推薦使用)

/path/to/script-name 或 ./script-name (目前路徑下執行腳本)

source script-name 或 . script-name (注意“.“點号)

執行說明:

1、腳本檔案本身沒有可執行權限或者腳本首行沒有指令解釋器時使用的方法,我們推薦用bash執行。

使用頻率:☆☆☆☆☆

2、腳本檔案具有可執行權限時使用。

使用頻率:☆☆☆☆

3、使用source或者.點号,加載shell腳本檔案内容,使shell腳本内容環境和目前使用者環境一緻。

使用頻率:☆☆☆
使用場景:環境一緻性

2.1.2 腳本開發規範

1、腳本命名要有意義,檔案字尾是.sh

2、腳本檔案首行是而且必須是腳本解釋器

#!/bin/bash

3、腳本檔案解釋器後面要有腳本的基本資訊等内容

腳本檔案中盡量不用中文注釋;

盡量用英文注釋,防止本機或切換系統環境後中文亂碼的困擾

常見的注釋資訊:腳本名稱、腳本功能描述、腳本版本、腳本作者、聯系方式等

4、腳本檔案常見執行方式:bash 腳本名

5、腳本内容執行:從上到下,依次執行

6、代碼書寫優秀習慣;

1)成對内容的一次性寫出來,防止遺漏。

如:()、{}、[]、’’、``、""

2)[]中括号兩端要有空格,書寫時即可留出空格[ ],然後再倒退書寫内容。

3)流程控制語句一次性書寫完,再添加内容

7、通過縮進讓代碼易讀;(即該有空格的地方就要有空格)

---------------

2.2 變量

變量的學習我們主要從四個方面來學習:

變量的定義和分類

本地變量

全局變量

shell内置變量

2.2.1 什麼是變量

變量是什麼?

變量包括兩部分:

變量名 不變的

變量值 變化的

我們一般所說的變量指的是:變量名

2.2.2 本地變量

本地變量是什麼?

本地變量就是:在目前系統的某個環境下才能生效的變量,作用範圍小。

本地變量包含兩種:普通變量和指令變量

普通變量:

普通變量的定義方式有如下三種,接下來我們就分别說一下這三種方式:

方式一:

變量名=變量值

重點:

變量值必須是一個整體,中間沒有空格等特殊字元

方式二:

變量名=‘變量值’

重點:

我看到的内容,我就輸出什麼内容

方式三:

變量名=“變量值”

重點:

如果變量值範圍内,有可以解析的變量A,那麼首先解析變量A,将A的結果和其他内容組合成一個整體,重新指派給變量B

習慣:

數字不加引号,其他預設加雙引号

指令變量(熟練)

指令變量有兩種定義方式,接下來我們就來介紹一下這兩種方式

定義方式一:

變量名=`指令` , `是tab鍵上面的`,不要混淆
注意:
` 是反引号

定義方式二: (推薦使用)

變量名=$(指令)

執行流程:

1、執行`或者$()範圍内的指令

2、将指令執行後的結果,指派給新的變量名A

---------------

2.2.3 全局變量

全局變量是什麼

全局變量就是:在目前系統的所有環境下都能生效的變量。

檢視全局變量指令

可以通過指令檢視環境變量

env 隻顯示全局變量
env | grep SHELL 檢視全局變量中的shell指令

定義全局變量

方法一:

變量=值
export 變量

方法二:(最常用)

export 變量=值
eg: export test1=hello1 export test2=hello2
env | grep test 就會列印出上面的兩個全局變量

2.2.4 變量檢視和取消

檢視變量:

方式一:

$變量名

場景:

私下裡,在指令行/腳本中使用

圖省事

方式二:

“$變量名”

場景:

私下裡,在指令行/腳本中使用

圖省事

方式三:

${變量名}

場景:

echo " dsa dsafsa dsafsa ${變量名} f "

使用頻率較高

方式四:

"${變量名}"

場景:

标準使用方式

取消變量

unset 變量名

2.2.5 shell内置變量

我們之前學習的本地變量,全局變量都是需要通過定義,然後才能實作相應功能的,那麼有沒有一些變量我們可以直接拿過來使用實作某種具體的功能呢?有,這就是shell内置變量

和腳本檔案有關

符号 意義

$0 擷取目前執行的shell腳本檔案名,包括腳本路徑

$n

擷取目前執行的shell腳本的第n個參數值,n=1…9,當n為0時表示腳本的檔案名,如果n大于9就要用大

括号括起來${10}

$# 擷取目前shell指令行中參數的總個數

$? 擷取執行上一個指令的傳回值(0為成功,非0為失敗)

重點内置變量示範效果:

$0 擷取腳本的名稱

示例:

vim get_name.sh

#!/bin/bash
# 擷取腳本的名稱
echo “我腳本的名稱是: get_name.sh”
echo “我腳本的名稱是:$0”
bash get_name.sh:
我腳本的名稱是: get_name.sh
我腳本的名稱是: get_name.sh
mv get_name.sh get_name1.sh
bash get_name1.sh:
我腳本的名稱是: get_name.sh
我腳本的名稱是: get_name1.sh

$# 擷取目前腳本傳入參數的數量,執行指令的時候,

$n 擷取目前腳本傳入的第n個位置的參數

示例:

vim get_arg.sh
#!/bin/bash
# 擷取目前腳本傳入的參數數量
echo “目前腳本傳入的參數數量是: $#”
# 擷取指定位置的參數
echo “第一個位置的參數是: $1”
echo “第二個位置的參數是: $2”
echo “第三個位置的參數是: $3”
echo “第四個位置的參數是: $4”
bash get_arg.sh a b c d :
echo "目前腳本傳入的參數數量是:4
echo “第一個位置的參數是: $1”
echo “第二個位置的參數是: $2”
echo “第三個位置的參數是: $3”
echo “第四個位置的參數是: $4”

$? 擷取檔案執行或者指令執行的傳回狀态值

示例:

# bash nihao
bash: nihao: No such file or directory
# echo $?
127
# ls
file1.sh num.sh test.sh weizhi.sh
# echo $?

---------------

字元串精确截取

格式:${變量名:起始位置:截取長度}

示例:

teststr=sakjj,dfnskdfajla

${ teststr:0:5} 從第1個字元開始,截取5個字元
${ teststr::5} 從第1個字元開始,截取5個字元
${ teststr:5:5} 從第6個字元開始,截取5個字元
${ teststr:5} 從第6個字元開始,截取後面所有的字元
${ teststr:0-5} 從倒數第5個字元開始,截取後面所有的字元
${ teststr:0-6:3} 從倒數第6個字元開始,截取之後的3個字元

預設值相關

場景一:

變量a如果有内容,那麼就輸出a的變量值

變量a如果沒有内容,那麼就輸出預設的内容

格式:

${變量名:-預設值}

套餐示例:

如果我輸入的參數為空,那麼輸出内容是 “您選擇的套餐是: 套餐 1”

如果我輸入的參數為n,那麼輸出内容是 “您選擇的套餐是: 套餐 n”

#!/bin/bash
# 套餐選擇示範
a="$1"
echo “您選擇的套餐是: 套餐 ${a:-1}”

場景二:

無論變量a是否有内容,都輸出預設值

格式:

${變量名+預設值}

場景示例:

不管我說國家法定結婚年齡是 多少歲,都輸出 國家法定結婚年齡(男性)是 22 歲

#!/bin/bash
# 預設值示範示例二
a="$1"
echo “國家法定結婚年齡(男性)是 ${a+22} 歲”

---------------

第 3 章 SHELL 進階

這部分的知識,我們主要是從三個方面來學習:

測試語句

表達式(條件+計算)

linux常見符号和指令

3.1 表達式

要使Shell腳本程式具備一定的“邏輯能力”,面臨的第一個問題就是:區分不同的情況以确定執行何種操作,下面我們就來學習解決這個問題—測試語句

3.1.1 測試語句

Shell環境根據指令執行後的傳回狀态值($?)來判斷是否執行成功,當傳回值為0,表示成功,值為其他時,表示失敗。使用專門的測試工具—test指令,可以對特定條件進行測試,并根據傳回值來判斷條件是否成立(傳回值0為成立)

測試語句形式

A: test 條件表達式

eg:

test 1=1

echo $? #驗證上條指令是否成功,0表示成功,非0失敗

B: [ 條件表達式 ] 常用這種 ; 兩邊各有一個空格隔開

eg:

[ 1=1 ]

echo $?

格式注意:

以上兩種方法的作用完全一樣,後者為常用。
但後者需要注意方括号[、]與條件表達式之間至少有一個空格。
test跟 [] 的意思一樣
條件成立,狀态傳回值是0
條件不成立,狀态傳回值是1

操作注意:

[]兩側為什麼要有空格
[email protected]:~# [-x /bin/bash ]
[-x: command not found
可以看到:
兩側沒有空格,就會報錯,為什麼呢?因為你不合規範

3.1.2 條件表達式

我們這部分内容主要是介紹,測試語句中的 [ 條件表達式 ] 這一部分,測試的結果使用

echo $? 來檢視

邏輯表達式

邏輯表達式一般用于判斷多個條件之間的依賴關系。

常見的邏輯表達式有: && 和 ||

&&

指令1 && 指令2

如果指令1執行成功,那麼我才執行指令2 – 夫唱婦随

如果指令1執行失敗,那麼指令2也不執行

示例:

# [ 1 = 1 ] && echo “條件成立”
條件成立
# [ 1 = 2 ] && echo “條件成立”
#

||

指令1 || 指令2

如果指令1執行成功,那麼指令2不執行 – 對着幹

如果指令1執行失敗,那麼指令2執行

示例:

# [ 1 = 2 ] || echo “條件不成立”
條件不成立
# [ 1 = 1 ] || echo “條件不成立”
#

檔案表達式

-f 判斷輸入内容是否是一個檔案

示例:

# [ -f weizhi.sh ] && echo “是一個檔案”
是一個檔案
# [ -f weizhi.sddh ] || echo “不是一個檔案”
不是一個檔案

-d 判斷輸入内容是否是一個目錄

示例:

# [ -d weizhi.sddh ] || echo “不是一個目錄”
不是一個目錄
# mkdir nihao
# [ -d nihao ] && echo “是一個目錄”
是一個目錄

-x 判斷輸入内容是否可執行

示例:

# [ -x age.sh ] || echo “檔案沒有執行權限”
檔案沒有執行權限
# [ -x test.sh ] && echo “檔案有執行權限”
檔案有執行權限
[ -x test.sh ] || chmod +x test.sh # 如果不是可執行檔案就添加執行權限

數值操作符

主要根據給定的兩個值,判斷第一個與第二個數的關系,如是否大于、小于、等于第二個數。常見選項如下:

n1 -eq n2 相等

n1 -gt n2 大于

n1 -lt n2 小于

n1 -ne n2 不等于

字元串比較

str1 == str2 str1和str2字元串内容一緻

str1 != str2 str1和str2字元串内容不一緻,!表示相反的意思

實踐

判斷字元是否内容一緻

[email protected]:~# [ a == a ]
[email protected]:~# echo $?
[email protected]:~# [ a != a ]
[email protected]:~# echo $?
1

---------------

3.1.3 計算表達式

定義:

計算表達式,簡單來說就是對具體的内容進行算數計算

格式:

方式一:

$(()) $(( 計算表達式 ))

方式二:

let let 計算表達式
注意:
$(())中隻能用±*/和()運算符,并且隻能做整數運算

$(())示範效果

格式:a=$((變量名a+1))

注意:
表達式範圍内,空格不限制

計算示例

[email protected]:~# echo $((100/5))
20

let示範效果

格式:let 變量名a=變量名a+1

注意:
表達式必須是一個整體,中間不能出現空格等特殊字元

let示例

[email protected]:~# i=1
[email protected]:~# let i=i+7
[email protected]:~# echo $i
8

3.2 linux常見符号

接下來我們來介紹幾個linux的場景符号:

重定向符号、管道符、其他符号

3.2.1 重定向符号

在shell腳本中有兩種常見的重定向符号 > 和 >>

> 符号

作用:

> 表示将符号左側的内容,以覆寫的方式輸入到右側檔案中

示範:

檢視檔案内容
[email protected]:~$ cat file.txt
nihao
使用重定向符号給檔案中增加内容
[email protected]:~$ echo “file1.txt” > file.txt
再次檢視檔案内容
[email protected]:~$ cat file.txt
file1.txt

>> 符号

作用:

>> 表示将符号左側的内容,以追加的方式輸入到右側檔案的末尾行中

示範:

檢視檔案内容
[email protected]:~$ cat file.txt
file1.txt
使用重定向符号給檔案中增加内容
[email protected]:~$ echo “file2.txt” >> file.txt
再次檢視檔案内容
[email protected]:~$ cat file.txt
file1.txt
file2.txt

3.2.2 管道符 |

定義:

| 這個就是管道符,傳遞資訊使用的

使用格式:

指令1 | 指令2

管道符左側指令1 執行後的結果,傳遞給管道符右側的指令2使用

指令示範:

檢視目前系統中的全局變量SHELL

[email protected]:~$ env | grep SHELL
SHELL=/bin/bash

3.2.3 其他符号

背景展示符号 &

定義:

& 就是将一個指令從前台轉到背景執行

使用格式:

指令 &

指令示範:

[email protected]:~# sleep 4
界面卡住4秒後消失
[email protected]:~# sleep 10 &
[1] 4198
[email protected]:~# ps aux | grep sleep
root 4198 0.0 0.0 9032 808 pts/17 S 21:58 0:00 sleep 10
root 4200 0.0 0.0 15964 944 pts/17 S+ 21:58 0:00 grep --color=auto sleep

全部資訊符号 2>&1

符号詳解:

1 表示正确輸出的資訊

2 表示錯誤輸出的資訊

2>&1 代表所有輸出的資訊

符号示例

标準正确輸出示例

cat nihao.txt 1>> zhengque

标準錯誤輸出示例

dsfadsfadsfa 2>> errfile

綜合演練示例

腳本内容

#!/bin/bash
echo ‘下一條錯誤指令’
dsfsafsafdsa

腳本執行效果

[email protected]:~# bash ceshi.sh
下一條錯誤指令
ceshi.sh: line 3: dsfsafsafdsa: command not found

1 和 2 綜合演練

[email protected]:~# bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err
[email protected]:~# cat ceshi-ok
下一條錯誤指令
[email protected]:~# cat ceshi-err
ceshi.sh: line 3: dsfsafsafdsa: command not found

全部資訊演練

[email protected]:~# bash ceshi.sh >> ceshi-all 2>&1
[email protected]:~# cat ceshi-all
下一條錯誤指令
ceshi.sh: line 3: dsfsafsafdsa: command not found

linux系統垃圾桶

/dev/null 是linux下的一個裝置檔案,

這個檔案類似于一個垃圾桶,特點是:容量無限大

3.3 常見指令詳解

接下來我們介紹一些shell腳本中經常使用的linux指令:grep、sed、awk、find

3.3.1 grep指令詳解

grep指令是我們常用的一個強大的文本搜尋指令。

指令格式詳解

grep [參數] [關鍵字] <檔案名>

注意:

我們在檢視某個檔案的内容的時候,是需要有<檔案名>
grep指令在結合|(管道符)使用的情況下,後面的<檔案名>是沒有的
可以通過 grep --help 檢視grep的幫助資訊

參數詳解

-c:隻輸出比對行的計數。

-n:顯示比對行及行号。

-v:顯示不包含比對文本的所有行。

模闆檔案

[email protected]:~$ cat find.txt
nihao aaa
nihao AAA
NiHao bbb
nihao CCC

-c: 輸出比對到aaa的個數

[email protected]:~$ grep -c aaa find.txt
1

-n: 輸出比對内容,同時顯示行号

[email protected]:~$ grep -n CCC find.txt
4:nihao CCC

-v: 比對到的内容部輸出,輸出不比對的内容

[email protected]:~$ grep -v ni find.txt
NiHao bbb

小技巧:

精确定位錯誤代碼

grep -nr [錯誤關鍵字] *

---------------

3.3.2 sed指令詳解

sed 行檔案編輯工具。因為它編輯檔案是以行為機關的。

指令格式詳解

指令格式:

sed [參數] ‘<比對條件> [動作]’ [檔案名]

注意:

可以通過 sed --help 檢視grep的幫助資訊

參數詳解:

參數為空 表示sed的操作效果,實際上不對檔案進行編輯

-i 表示對檔案進行編輯

注意:mac版本的bash中使用 -i參數,必須在後面單獨加個東西: -i ‘’

比對條件:

比對條件分為兩種:數字行号或者關鍵字比對

關鍵字比對格式:

‘/關鍵字/’
注意:
隔離符号 / 可以更換成 @、#、!等符号
根據情況使用,如果關鍵字和隔離符号有沖突,就更換成其他的符号即可。

動作詳解

-a 在比對到的内容下一行增加内容

-i 在比對到的内容上一行增加内容

-d 删除比對到的内容

-s 替換比對到的内容

注意:

上面的動作應該在參數為-i的時候使用,不然的話不會有效果

替換指令示範

關于替換,我們從三個方面來學習:

行号、列号、全體

指令格式:

sed -i [替換格式] [檔案名]
注意:替換指令的寫法
‘s###’ —> ‘s#原内容##’ —> ‘s#原内容#替換後内容#’

常見替換格式:

模闆檔案内容

[email protected]:~$ cat sed.txt
nihao sed sed sed
nihao sed sed sed
nihao sed sed sed

替換每行首個比對内容:

sed -i ‘s#原内容#替換後内容#’ 檔案名
示例:替換首每行的第1個sed為SED
sed -i ‘s#sed#SED#’ sed.txt 表示隻替換第一行的第一個sed

[email protected]:~$ sed -i ‘s#sed#SED#’ sed.txt

#表示替換所有行的第一個sed

[email protected]:~$ cat sed.txt
nihao SED sed sed
nihao SED sed sed
nihao SED sed sed

替換全部比對内容:

sed -i ‘s#原内容#替換後内容#g’ 檔案名
sed -i ‘s#sed#SED#2’ sed.txt 表示替換掉每一行的第二個sed
示例:替換全部sed為des
[email protected]:~$ sed -i ‘s#sed#SED#g’ sed.txt
[email protected]:~$ cat sed.txt
nihao SED SED SED
nihao SED SED SED
nihao SED SED SED

指定行号替換首個比對内容:

sed -i ‘行号s#原内容#替換後内容#’ 檔案名
示例:替換第2行的首個SED為sed
[email protected]:~$ sed -i ‘2s#SED#sed#’ sed.txt
[email protected]:~$ cat sed.txt
nihao SED SED SED
nihao sed SED SED
nihao SED SED SED

首行指定列号替換比對内容:

sed -i ‘s#原内容#替換後内容#列号’ 檔案名
示例:替換每行的第2個SED為sed
[email protected]:~$ sed -i ‘s#SED#sed#2’ sed.txt
[email protected]:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed SED

指定行号列号比對内容:

sed -i ‘行号s#原内容#替換後内容#列号’ 檔案名
示例:替換第3行的第2個SED為sed
[email protected]:~$ sed -i ‘3s#SED#sed#2’ sed.txt
[email protected]:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed sed

增加操作

作用:

在指定行号的下一行增加内容

格式:

sed -i ‘行号a\增加的内容’ 檔案名

注意:

如果增加多行,可以在行号位置寫個範圍值,彼此間使用逗号隔開,例如
sed -i ‘1,3a\增加内容’ 檔案名

示範效果:

指定行号增加内容
[email protected]:~$ sed -i ‘2a\zengjia-2’ sed.txt
[email protected]:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
zengjia-2
nihao SED sed sed
指定1~3每行都增加内容
[email protected]:~$ sed -i ‘1,3a\tongshi-2’ sed.txt
[email protected]:~$ cat sed.txt
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed

作用:

在指定行号的當行增加内容

格式:

sed -i ‘行号i\增加的内容’ 檔案名

注意:

如果增加多行,可以在行号位置寫個範圍值,彼此間使用逗号隔開,例如
sed -i ‘1,3a\增加内容’ 檔案名

示範效果:

指定行号增加内容
[email protected]:~$ sed -i ‘1i\insert-1’ sed.txt
[email protected]:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed

删除操作

作用:

指定行号删除

格式:

sed -i ‘行号d’ 檔案名

注意:

如果删除多行,可以在行号位置多寫幾個行号,彼此間使用逗号隔開,例如
sed -i ‘1,3d’ 檔案名

删除演練

删除第4行内容
[email protected]:~$ sed -i ‘4d’ sed.txt
[email protected]:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
删除多行(3-5行)内容
[email protected]:~$ sed -i ‘3,5d’ sed.txt
[email protected]:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao SED sed sed

---------------

3.3.3 awk指令詳解

awk是一個功能非常強大的文檔編輯工具,它不僅能以行為機關還能以列為機關處理檔案。

指令格式:

awk [參數] ‘[ 動作]’ [檔案名]

常見參數:

-F 指定行的分隔符

常見動作:

print 顯示内容

$0 顯示目前行所有内容
$n 顯示目前行的第n列内容,如果存在多個$n,它們之間使用逗号(,)隔開

常見内置變量

FILENAME 目前輸入檔案的檔案名,該變量是隻讀的

NR 指定顯示行的行号

NF 輸出 最後一列的内容

OFS 輸出格式的列分隔符,預設是空格

FS 輸入檔案的列分融符,預設是連續的空格和Tab

指令示範

模闆檔案内容

[email protected]:~$ cat awk.txt
nihao awk awk awk
nihao awk awk awk

列印指定列内容

列印第1列的内容
[email protected]:~$ awk ‘{print $1}’ awk.txt
nihao
nihao

指定行列印内容

列印第一行第1和第3列内容
[email protected]:~$ awk ‘NR==1 {print $1,$3}’ awk.txt
nihao awk

指定隔離分隔符,檢視内容

[email protected]:~$ cat linshi.txt
root❌0:0:root:/root:/bin/bash
[email protected]:~$ awk -F ‘:’ ‘{print $1,$7}’ linshi.txt
root /bin/bash

設定顯示分隔符,顯示内容

[email protected]:~$ awk ‘BEGIN{OFS=":"} {print NR,$0}’ awk.txt
1:nihao awk awk awk
2:nihao awk awk awk

3.3.4 find指令詳解

指令格式:

find [路徑] [參數] [關鍵字]

參數詳解

-name 按照檔案名查找檔案。

-perm 按照檔案權限來查找檔案。

-user 按照檔案屬主來查找檔案。

-group 按照檔案所屬的組來查找檔案。

-type 查找某一類型的檔案,

諸如:
b - 塊裝置檔案 d - 目錄 c - 字元裝置檔案
p - 管道檔案 l - 符号連結檔案 f - 普通檔案。

-size n:[c] 查找檔案長度為n塊的檔案,帶有c時表示檔案長度以位元組計。

-depth:在查找檔案時,首先查找目前目錄中的檔案,然後再在其子目錄中查找。

-mindepth

n:在查找檔案時,查找目前目錄中的第n層目錄的檔案,然後再在其子目錄中查找。

! : 表示取反

指令示範

在目前系統中查找一個叫awk的檔案

[email protected]:~$ sudo find /home/admin-1/ -name “awk.txt”
/home/admin-1/awk.txt

在目前系統中查找檔案類型為普通檔案的檔案

[email protected]:~$ find /tmp -type f
/tmp/.X0-lock
/tmp/vgauthsvclog.txt.0
/tmp/unity_support_test.0
/tmp/config-err-4igbXW

---------------

第4章 流程控制

在shell的語句中,流程控制主要分為兩種:

簡單流程控制語句:選擇和循環

複雜流程控制語句:函數

4.1 簡單流程控制語句

4.1.1 單分支if語句

文法格式

if [ 條件 ]
then
指令
fi

場景:

單一條件,隻有一個輸出

單分支if語句示例

#!/bin/bash
# 單if語句的使用場景
if [ “$1” == “nan” ]
then
echo “您的性别是 男”
fi

4.1.2 雙分支if語句

文法格式

if [ 條件 ]
then
指令1
else
指令2
fi

場景:

一個條件,兩種結果

雙分支if語句示例

#!/bin/bash
# 單if語句的使用場景
if [ “$1” == “nan” ]
then
echo “您的性别是 男”
else
echo “您的性别是 女”
fi

4.1.3 多分支if語句

文法格式

if [ 條件 ]
then
指令1
elif [ 條件2 ]
then
指令2
else
指令3
fi

場景:

n個條件,n+1個結果

多分支if語句示例

#!/bin/bash
# 單if語句的使用場景
if [ “$1” == “nan” ]
then
echo “您的性别是 男”
elif [ “$1” == “nv” ]
then
echo “您的性别是 女”
else
echo “您的性别,我不知道”
fi

多if語句生産場景: 服務的啟動

需求:

要求腳本執行需要有參數,通過傳入參數來實作不同的功能。
參數和功能詳情如下:
參數 執行效果

start 服務啟動中…

stop 服務關閉中…

restart 服務重新開機中…

* 腳本 X.sh 使用方式 X.sh [ start|stop|restart ]

腳本内容

[email protected]:/data/scripts/python-n# cat if.sh
#!/bin/bash
# 多if語句的使用場景
if [ “$1” == “start” ]
then
echo “服務啟動中…”
elif [ “$1” == “stop” ]
then
echo “服務關閉中…”
elif [ “$1” == “restart” ]
then
echo “服務重新開機中…”
else
echo “$0 腳本的使用方式: $0 [ start | stop | restart ]”
fi

4.1.4 case選擇語句

我們發現多if語句使用的時候,代碼量很多,而且整體看起來确實有那麼一丁點亂,有沒有辦法更好的實作這種效果呢?就是Case語句。

case 語句格式

case 變量名 in
值1)
指令1
;;
值2)
指令2
;;
值3)
指令3
;;
esac

注意:

首行關鍵字是case,末行關鍵字esac
選擇項後面都有 )
每個選擇的執行語句結尾都有兩個分号;

case語句示例

場景:在多if語句的基礎上對腳本進行更新

需求:

要求腳本執行需要有參數,通過傳入參數來實作不同的功能。
參數和功能詳情如下:
參數 執行效果

start 服務啟動中…

stop 服務關閉中…

restart 服務重新開機中…

* 腳本 X.sh 使用方式 X.sh [ start|stop|restart ]

腳本内容:

# cat case.sh
#!/bin/bash
# case語句使用場景
case “$1” in
“start”)
echo “服務啟動中…”
;;
“stop”)
echo “服務關閉中…”
;;
“restart”)
echo “服務重新開機中…”
;;
*)
echo “$0 腳本的使用方式: $0 [ start | stop | restart ]”
;;
esac

---------------

4.1.5 for循環語句

循環指定的所有元素,循環完畢之後就退出

文法格式

文法格式

for 值 in 清單
do
執行語句
done

場景:

周遊清單

注意:

”for” 循環總是接收 “in” 語句之後的某種類型的字清單
執行次數和list清單中常數或字元串的個數相同,當循環的數量足夠了,就自動退出

示例:周遊檔案

#!/bin/bash
# for語句的使用示例
for i in $(ls /root)
do
echo “${i}”
done

4.1.6 while循環語句

文法格式

while 條件

do

執行語句

done

注意:

條件的類型:

指令、[[ 字元串表達式 ]]、(( 數字表達式 ))

場景:

隻要條件滿足,就一直循環下去

while語句示例

腳本内容

#!/bin/bash
# while的示例
a=1
while [ “${a}” -lt 5 ]
do
echo “${a}”
a=$((a+1))
done

4.1.7 until循環語句

文法格式

until 條件

do

執行語句

done

注意:

條件的類型:

指令、[[ 字元串表達式 ]]、(( 數字表達式 ))

場景:

隻要條件不滿足,就一直循環下去

until語句示例

腳本内容

#!/bin/bash
# until的示例
a=1
until [ “${a}” -eq 5 ]
do
echo “${a}”
a=$((a+1))
done

---------------

4.2 複雜流程控制語句

函數就是我們的複雜流程控制語句

4.2.1 函數基礎知識

函數是什麼?

函數就是将某些指令組合起來實作某一特殊功能的方式,是腳本編寫中非常重要的一部分。

簡單函數格式:

定義函數:

函數名(){
函數體
}

調用函數:

函數名

傳參函數格式:

傳參數

函數名 參數

函數體調用參數:

函數名(){
函數體 $n
}

注意:

類似于shell内置變量中的位置參數

4.2.2 函數實踐

簡單函數定義和調用示例

#!/bin/bash
# 函數使用場景一:執行頻繁的指令
dayin(){
echo “wo de mingzi shi 111”
}
dayin

函數傳參和函數體内調用參數示例

#!/bin/bash
# 函數的使用場景二
dayin(){
echo “wo de mingzi shi $1”
}
dayin 111

函數調用腳本傳參

#!/bin/bash
# 函數傳參示範
# 定義傳參數函數
dayin(){
echo “wode mignzi shi $1”
}
# 函數傳參
dayin $1

腳本傳多參,函數分别調用示例

#!/bin/bash
# 函數的使用場景二
dayin(){
echo “wo de mingzi shi $1”
echo “wo de mingzi shi $2”
echo “wo de mingzi shi $3”
}
dayin 111 df dfs

---------------

4.3 第一階段綜合案例

需求

1、zonghe.sh 腳本執行時候需要添加參數才能執行
參數和功能詳情如下:
參數 執行效果
start 服務啟動中…
stop 服務關閉中…
restart 服務重新開機中…
* 腳本幫助資訊…
2、參數的數量有限制,隻能是1個,多餘一個會提示腳本的幫助資訊
3、幫助資訊使用函數來實作
資訊内容:腳本 zonghe.sh 使用方式 zonghe.sh [ start|stop|restart ]

知識點分析:

1、zonghe.sh 腳本執行時候需要添加參數才能執行

腳本傳參、case語句

2、參數的數量有限制,隻能是1個,多餘一個會提示腳本的幫助資訊

參數數量、條件表達式(驗證+數字)、if語句

3、幫助資訊使用函數來實作

函數定義+調用

4、if語句和case語句嵌套

if語句在外,case語句在内

腳本編寫流程:

1、先寫主流程架構

2、完善函數功能

3、完善需求功能

代碼實踐

#!/bin/bash
# 定義本地變量
arg="$1"
# 腳本幫助資訊
usage(){
echo “腳本 $0 的使用方式是: $0 [ start|stop|restart ]”
}
# 函數主架構
if [ $# -eq 1 ]
then
case “${arg}” in
start)
echo “服務啟動中…”
;;
stop)
echo “服務關閉中…”
;;
restart)
echo “服務重新開機中…”
;;
*)
usage
;;
esac
else
usage
fi

第 5 章 代碼釋出

5.1 代碼釋出簡介

到現在為止我們學會了多個開發項目案例,也知道工作中如何做一個項目,但是一個項目方案的如何部署到公司的線上伺服器上,部署過程中都會經曆哪些事情呢?接下來我們好好的來梳理一下。

5.1.1 代碼釋出介紹

什麼是代碼釋出?

代碼釋出就是一句話:将我們的代碼放到一台公司的網際網路伺服器上。

那麼我們應該怎麼來了解這句話呢?我們從三個方面來了解他。

如何了解這句話?

釋出什麼?

代碼 經過測試,功能完善,沒有問題的代碼

釋出到哪裡?

伺服器 所有人都能通路的到的一台伺服器(有公網IP)

idc機房、阿裡雲、亞馬遜、騰訊雲、華為雲、…

釋出的效果?

web網頁對外展示

5.1.2 釋出方式

常見的代碼釋出方式有兩種:手工方式和腳本方式。

這兩種方式有什麼差別呢?我們接下來好好的對比分析一下。

手工釋出代碼 步行

幹擾因素多

不安全

腳本釋出代碼 坐車

幹擾因素少

安全

5.2 代碼釋出流程

5.2.1 流程簡介

接下來我們來好好的說一下部署的流程:

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

---------------

注: 大型腳本流程

5.2.2 流程詳解

接下來我們來對每個過程進行一個仔細的叙述

部署場景:

兩台主機做部署動作

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

注意:

部署的檔案就是兩台主機右上角的紅色内容

擷取代碼

代碼倉庫

集中式的: svn

分布式的: git

差別:
svn的幾乎所有操作指令,都集中在我和代碼倉庫伺服器處于網絡連接配接狀态。
git的幾乎所有操作指令,可以在本地完成,和代碼倉庫伺服器是否連接配接無關。

公司的代碼倉庫:

私有倉庫 gitlab

内部伺服器或者公網伺服器

倉庫權限

隻有項目的開發人員才有權限,項目之外的人沒有權限

代碼權限:

開發、管理、檢視

送出的方式:

代碼版本号

打包代碼

場景示範:

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

目的:

減少傳輸檔案數量

減小傳輸檔案大小

增強傳輸速率

常見打包方式:

windows:

zip、rar…

linux:

tar、zip…

傳輸代碼

場景效果:

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

傳輸方式:

有網情況下

多種方式:

git、ftp、scp、共享挂載 cp、rsync

沒有網情況下

實體方式:

U盤或者硬碟

關閉應用

代碼所在的服務用到了什麼應用,就關閉什麼應用

關閉的順序:

先關閉離客戶近的,後關閉離客戶遠的

解壓代碼:

tar xf …

放置代碼

為了避免我們在放置代碼過程中,對老檔案造成影響,是以我們放置代碼一般分為兩步:備份老檔案和放置新檔案。

備份原檔案

在這裡插入圖檔描述

放置新檔案

注意:

兩個檔案的名稱是一樣的,隻是内容不同

對整個應用項目來說,兩個檔案沒有差別

開啟應用

剛才關閉了什麼應用就開啟什麼應用

開啟的順序:

先開啟離客戶遠的,後開啟離客戶近的

檢查

檢視浏覽器效果或者netstat -tnulp檢視系統開放的端口

---------------

5.2.3 技術關鍵點

檔案的壓縮和解壓

檔案的壓縮

壓縮格式:
tar zcvf 壓縮後的檔案名 将要壓縮的檔案

檔案的解壓

解壓格式:
tar xf 壓縮後的檔案名

指令參數詳解

z 指定壓縮檔案的格式為 tar.gz
c 表示壓縮
v 顯示詳細過程
f 指定壓縮檔案
x 解壓

檢視壓縮檔案内容

zcat 壓縮檔案

檔案的傳輸

scp傳輸工具:

指令格式:

scp 要傳輸的檔案 要放置的位置

将本地檔案推送到遠端主機

scp python.tar.gz [email protected]:/root/

将遠端主機的檔案拉取到本地

scp [email protected]:/root/python.tar.gz ./

遠端主機檔案放置位置的表示形式:

遠端連接配接的使用者@遠端主機:遠端主機的目錄路徑

遠端主機檔案位置的表示形式:

遠端連接配接的使用者@遠端主機:遠端主機的檔案路徑

檔案的備份

檔案的備份要有一定的标志符号,我們就使用目前通用的時間戳的形式來表示

date指令詳解:

指令格式:date [option]
常見參數:
%F 顯示目前日期格式,%Y-%m-%d
%T 顯示目前時間格式,%H:%M:%S
示範效果:
顯示目前日期
# date +%F
2017-09-28
顯示目前時間
# date +%T
03:06:30
根據上面的參數介紹,我們可以指定指令顯示的格式,

年月日:date +%Y%m%d

時分秒:date +%H%M%S

示範效果:
顯示目前日期
# date +%Y%m%d
20170928
顯示目前時間
# date +%H%M%S
030643

指定時間戳格式:

年月日時分秒:date +%Y%m%d%H%M%S

時間戳示範效果:
指定的時間戳格式
# date +%Y%m%d%H%M%S
20170928030742

備份指令效果格式:

方式一:複制備份
cp nihao nihao-$(date +%Y%m%d%H%M%S)
方式二:移動備份
mv nihao nihao-$(date +%Y%m%d%H%M%S)
我們為了避免在放置新檔案時候,出現驗證操作,我們确定采用方式二:

---------------

練習案例:

1、在主機1上建立一個目錄/data/tar-ceshi/,在目錄裡面建立兩個檔案,内容分别如下:
檔案名 内容
file1.txt file1
file2.txt file2
2、對目錄tar-ceshi進行壓縮
3、對目錄tar-ceshi進行時間戳備份
4、将壓縮封包件傳輸到遠端主機2
5、在主機2上解壓 壓縮封包件
6、在主機2上修改壓縮封包件内容。然後再次壓縮
7、在主機1上拉取主機2的壓縮封包件
8、使用指令檢視壓縮封包件的内容

指令執行效果:

主機1操作指令

1、
mkdir /data/tar-ceshi -p
cd /data
echo ‘file1’ > tar-ceshi/file1.txt
echo ‘file1’ > tar-ceshi/file1.txt
2、tar zcvf tar-ceshi.tar.gz tar-ceshi
3、mv tar-ceshi tar-ceshi-$(date +%Y%m%d%H%M%S)
4、scp tar-ceshi.tar.gz [email protected]:/tmp

主機2操作指令

5、
cd /tmp
tar xf tar-ceshi.tar.gz
6、
echo ‘file3’ >> tar-ceshi/file1.txt
tar zcvf tar-ceshi-1.tar.gz tar-ceshi

主機1操作指令

7、scp [email protected]:/tmp/tar-ceshi-1.tar.gz ./
8、zcat tar-ceshi-1.tar.gz

第 6 章 環境部署

環境部署這塊,我們需要有一個項目的基礎環境,然後在這個基礎環境上,再根據項目需求搭建一個能讓項目代碼正常運作的環境。是以這塊的知識,我們從三個方面來學習

基礎環境
方案分析
項目環境部署

6.1 基礎環境

6.1.1 基礎目錄環境

建立基本目錄

# mkdir /data/{server,logs,backup,softs,virtual,scripts,codes} -p
# ls /data/
backup logs scripts server softs virtual codes

檢視

[email protected]:/data# tree -L 1 /data/
/data/
├── backup 備份
├── codes 代碼
├── logs 日志
├── scripts 腳本
├── server 服務
├── softs 軟體
└── virtual 虛拟環境

6.1.2 主機網絡環境

問題:

我們上面進行檔案傳輸的時候,發現一個問題,每次進行檔案傳輸都需要進行密碼驗證,這對我們來說,有些一丁點不舒服,那麼有沒有辦法,讓我痛苦一點?

答案就是:主機間免密碼認證

知識點:

什麼是主機間免密碼認證?

就是我和另外一台主機做任何事情,不需要輸入密碼認證,非常很友善。

方案詳解

我們要做主機間免密碼認證需要做三個動作

1、本機生成密鑰對
2、對端機器使用公鑰檔案認證
3、驗證

方案實施

1、生成秘鑰對(線上主機)

ssh-keygen -t rsa

-t 指定秘鑰的類型

rsa 秘鑰類型

秘鑰目錄:/root/.ssh/

私鑰 id_rsa 鑰匙

公鑰 id_rsa.pub 鎖

2、編輯認證檔案(代碼倉庫)

①vim /root/.ssh/authorized_keys (不存在則建立目錄檔案)

②複制線上主機的公鑰内容到該vim中

③将含有公鑰的authorized_keys檔案mv到 .ssh檔案夾中去

④在代碼倉庫主機中開啟使用authorized_keys: vim /etc/ssh/sshd_config

⑤将打開的vim檔案中的注釋打開: AuthorizedKeysFile %h/.ssh/authorized_keys

3、使配置檔案生效

重新開機ssh服務

/etc/init.d/ssh restart

4、驗證操作

ssh [email protected]

1是線上上主機上操作

2-4是在代碼倉庫上操作

---------------

6.2 方案分析

6.2.1 需求

需求:

部署一個環境,支援我們的django項目正常運作

6.2.2 需求分析

分析:

2、python環境 —> 3、python虛拟環境

1、django環境部署

4、django軟體安裝

5、項目基本操作

6、應用基本操作

7、view和url配置

8、問題:隻有本機能通路

9、方案代理---- 10、nginx

11、nginx實作代理

13、pcre軟體安裝

12、nginx軟體安裝

14、nginx基本操作

15、nginx代理的配置

16、目錄結構

17、檢視配置檔案

18、找到對應的代理配置項

19、啟動django

20、啟動nginx

21、整個項目調試

6.2.3 部署方案

環境部署方案

一、django環境部署

1.1 python虛拟環境

1.2 django環境部署

1.2.1 django軟體安裝

1.2.2 項目基本操作

1.2.3 應用基本操作

1.2.4 view和url配置

二、nginx代理django

2.1 nginx軟體安裝

2.1.1 pcre軟體安裝

2.1.2 nginx軟體安裝

2.1.3 nginx基本操作
2.2 nginx代理配置

2.2.1 目錄結構檢視

2.2.2 配置檔案檢視

2.2.3 編輯代理配置項

三、項目調試

3.1 啟動軟體

3.1.1 啟動django

3.1.2 啟動nginx

3.2 整個項目調試

6.3 項目環境部署

6.3.1 python虛拟環境

軟體安裝

安裝虛拟環境軟體

apt-get install python-virtualenv -y

虛拟環境基本操作

建立

cd /date/virtual/
virtualenv -p /usr/bin/python3.5 venv

進入虛拟環境

source venv/bin/activate

退出

deactivate

删除

rm -rf venv

6.3.2 django環境(基于虛拟環境)

django軟體安裝

注意:先進入虛拟環境

解壓

cd /data/soft
tar xf Django-1.10.7.tar.gz

檢視

cd Django-1.10.7
cat INSTALL or README

安裝

python setup.py install

拓展知識點:

python類型軟體的安裝流程

普通:

解壓 安裝

特殊:

解壓 編譯 安裝

編譯:python setup.py build

django項目操作

建立項目

cd /data/server
django-admin startproject itcast

django應用操作

建立應用

cd /data/server/itcast
python manage.py startapp test1

注冊應用

# vim itcast/settings.py
INSTALL_APP = [
。。。
‘test1’,
]

view和url配置

需求:

通路django的頁面請求為:127.0.0.1:8000/hello/,頁面傳回效果為:itcast v1.0

分析:

views檔案定制邏輯流程函數
urls檔案定制路由跳轉功能

view 配置檔案生效

a[email protected]:/data/soft# cat /data/server/itcast/test1/views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def hello(resquest):
return HttpResponse(“itcast V1.0”)

url檔案配置

a[email protected]:/data/soft# cat /data/server/itcast/itcast/urls.py
from test1.views import *
urlpatterns = [
url(r’^admin/’, admin.site.urls),
url(r’^hello/$’, hello),
]

啟動django:

cd /data/server/itcast
python manage.py runserver
在背景運作,不影響後面的安裝nginx:
python manage.py runserver >> /dev/null 2>&1 &

---------------

6.3.3 nginx環境(與虛拟環境無關,可以退出)

pcre軟體安裝

解壓

cd /data/soft/
tar xf pcre-8.39.tar.gz

檢視幫助

cd pcre-8.39
INSTALL 或者 README

配置

./configure

編譯

make

安裝

make install

拓展知識點:

linux中軟體安裝的一般流程

解壓

tar

解壓檔案,擷取真正的配置檔案

配置

configure

根據預設的配置項或者更改配置項,生成編譯配置檔案(Makefile)

編譯

make

根據 Makefile 内容,編譯生成指定的軟體所需要的所有檔案

安裝

make install

将編譯生成的所有檔案,轉移到軟體指定安裝的目錄下面

–prefix

nginx軟體安裝

解壓

cd /data/soft/
tar xf nginx-1.10.2.tar.gz

配置

cd nginx-1.10.2/

./configure --prefix=/data/server/nginx --without-http_gzip_module

配置預設目錄

若有報錯按照操作解決,若沒有提示,就使用./configure –help尋找解決

編譯

make

安裝

make install

nginx簡單操作

檢查

/data/server/nginx/sbin/nginx -t

開啟

/data/server/nginx/sbin/nginx

關閉

/data/server/nginx/sbin/nginx -s stop

重載(要處于開啟狀态)

/data/server/nginx/sbin/nginx -s reload

常見問題

突發問題:

[email protected]:/data/server/nginx# ./sbin/nginx -t

./sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot

open shared object file: No such file or directory

分析:

1、先看報錯

2、思考,是否報錯真實有效

分析: 誰錯了

3、查找檔案

全名找不到,我們使用正則

4、找到檔案,我沒有問題

nginx預設找庫檔案的路徑有問題

5、解決

解決:
[email protected]:/data/soft/nginx-1.10.2# ldd /data/server/nginx/sbin/nginx
linux-vdso.so.1 => (0x00007ffdb9154000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa59379b000)

libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0

(0x00007fa59357e000)

libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fa593345000)
libpcre.so.1 => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa592f7c000)
/lib64/ld-linux-x86-64.so.2 (0x0000564bfef41000)
查找檔案:
adm[email protected]:/data/soft/nginx-1.10.2# find / -name “libpcre.so.1”
/data/soft/pcre-8.39/.libs/libpcre.so.1
/usr/local/lib/libpcre.so.1
連結該檔案

[email protected]:/data/soft/nginx-1.10.2# ln -s /usr/local/lib/libpcre.so.1

/lib/x86_64-linux-gnu/

再次檢查一下nginx的配置檔案
[email protected]:/data/soft/nginx-1.10.2# /data/server/nginx/sbin/nginx -t

nginx: the configuration file /data/server/nginx/conf/nginx.conf syntax is

ok

nginx: configuration file /data/server/nginx/conf/nginx.conf test is

successful

---------------

6.3.4 nginx代理django

nginx配置簡介

nginx的目錄結構

[email protected]:/data/server/nginx# tree -L 2 /data/server/nginx/
/data/server/nginx/
├── …
├── conf 配置檔案目錄
│ …
│ ├── nginx.conf 預設的配置檔案
│ …
├── …
├── html 網頁檔案
│ ├── 50x.html
│ └── index.html
├── logs 日志目錄
│ ├── access.log
│ └── error.log
├── …
├── sbin 執行檔案目錄
│ └── nginx
├── …

vim /data/server/nginx/conf/nginx.conf 打開配置檔案

nginx配置檔案介紹

全局配置段

http配置段

server配置段 項目或者應用

location配置段 url配置

nginx代理配置

案例需求:

通路位址 192.168.8.14/hello/ 跳轉到

127.0.0.1:8000/hello/的django服務來處理hello請求

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼
代理是什麼?
哥,這事交給我就行了,您就甭操心了。

編輯配置檔案實作代理功能

配置内容

62: location /hello/ {
63: proxy_pass http://127.0.0.1:8000;
64: }
注釋:
當我通路位址是

配置檔案生效

/data/server/nginx/sbin/nginx -t
/data/server/nginx/sbin/nginx -s reload

---------------

第 7 章 手工代碼釋出

7.1 方案分析

釋出需求:

手工方式部署代碼

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

釋出方案:

擷取代碼

sed -i ‘s#檔案原始的内容#替換後的内容#g’ 要更改到檔案名

打包代碼

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

傳輸代碼

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

關閉應用

解壓代碼

放置代碼

備份老檔案

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

放置新檔案

SHELL自動化運維第 1 章 SHELL 快速入門第 2 章 SHELL 基礎知識第 3 章 SHELL 進階第4章 流程控制第 5 章 代碼釋出第 6 章 環境部署第 7 章 手工代碼釋出第 8 章 腳本釋出代碼

開啟應用

檢查

注意:
擷取代碼和打包代碼在代碼倉庫主機上進行操作
其他操作,都線上上伺服器進行操作

7.2 方案實施

擷取代碼

mkdir /data/codes -p
cd /data/codes
sed -i ‘s#1.0#1.1#’ django/views.py
sed -i ‘s#原内容#替換後内容#g’ 檔案

打包代碼

cd /data/codes/
tar zcf django.tar.gz django

注意:

前面兩步在代碼倉庫主機上操作

傳輸代碼(遠端傳輸到本地)

cd /data/codes/
scp [email protected]:/data/codes/django.tar.gz ./

關閉應用

關閉nginx應用

/data/server/nginx/sbin/nginx -s stop

關閉django應用

根據端口檢視程序号,

lsof -Pti :8000

殺死程序号

kill 56502

一條指令搞定它:
kill $(lsof -Pti :8000)

解壓代碼

cd /data/codes
tar xf django.tar.gz

放置代碼

備份老檔案

需求:備份的格式:

檔案名-時間戳

時間戳:年月日時分秒

date +%Y%m%d%H%M%S

mv /data/server/itcast/test1/views.py /data/backup/views.py-$(date

+%Y%m%d%H%M%S)

放置新檔案

cd /data/codes
mv django/views.py /data/server/itcast/test1/

開啟應用

開啟django應用

source /data/virtual/venv/bin/activate
cd /data/server/itcast/
python manage.py runserver >> /dev/null 2>&1 &
deactivate

開啟nginx應用

/data/server/nginx/sbin/nginx

檢查

netstat -tnulp | grep ‘:80’

---------------

注: 大型腳本之指令填充

第 8 章 腳本釋出代碼

關于腳本釋出代碼部分呢,我們将這個代碼部署流程拆分成兩部分:簡單腳本(遠端主機上執行)和大型腳本(線上機器執行),這樣我們能從兩個方面來學習生産中的腳本如何編寫。首先來說簡單腳本的編寫

8.1 簡單腳本編寫

簡單腳本我們從四個方面來學習:

1、指令羅列實作功能
2、固定内容變量實作
3、功能函數實作
4、遠端執行指令

8.1.1 指令羅列

目的:

實作代碼倉庫主機上的操作指令功能即可

實作簡單的功能— 簡單的指令羅列

#!/bin/bash
# 功能:打包代碼
# 腳本名:tar_code.sh
# 作者:itcast
# 版本:V 0.1
# 聯系方式:www.itcast.cn
cd /data/codes
[ -f django.tar.gz ] && rm -f django.tar.gz 檢查同名檔案是否存在若存在就删除
tar zcf django.tar.gz django

腳本編寫完成後,進行測試:

sed -i ‘s#1.1#1.2#’ /data/codes/django/views.py
bash /data/scripts/tar_code.sh

檢視壓縮檔案内容

zcat django.tar.gz

8.1.2 固定内容變量化

問題:

腳本裡面的手寫的固定的内容太多了,更改時候費勁

腳本優化之 固定内容變量化

#!/bin/bash
# 功能:打包代碼
# 腳本名:tar_code.sh
# 作者:itcast
# 版本:V 0.2
# 聯系方式:www.itcast.cn
FILE=‘django.tar.gz’
CODE_DIR=’/data/codes’
CODE_PRO=‘django’
cd “${CODE_DIR}”
[ -f “${FILE}” ] && rm -f “${FILE}”
tar zcf “${FILE}” “${CODE_PRO}”

腳本編寫完成後,進行測試:

sed -i ‘s#1.2#1.3#’ /data/codes/django/views.py
bash /data/scripts/tar_code.sh

檢視壓縮檔案内容

zcat django.tar.gz

8.1.3 功能函數化

需求:

三條指令其實是一個組合,實作的是一個功能

腳本優化之 功能函數化

#!/bin/bash
# 功能:打包代碼
# 腳本名:tar_code.sh
# 作者:itcast
# 版本:V 0.3
# 聯系方式:www.itcast.cn
FILE=‘django.tar.gz’
CODE_DIR=’/data/codes’
CODE_PRO=‘django’
code_tar(){
cd “${CODE_DIR}”
[ -f “${FILE}” ] && rm -f “${FILE}”
tar zcf “${FILE}” “${CODE_PRO}”
}
code_tar

腳本編寫完成後,進行測試:

sed -i ‘s#1.2#1.3#’ /data/codes/django/views.py
bash /data/scripts/tar_code.sh

檢視壓縮檔案内容

zcat /data/codes/django.tar.gz

8.1.4 遠端執行

遠端指令執行

格式:

ssh 遠端主機登入使用者名@遠端主機ip位址 “執行指令”

效果

[email protected]:/data/server/itcast# ssh [email protected] “ifconfig eth0”
eth0 Link encap:Ethernet HWaddr 00:0c:29:f7:ca:d4
inet addr:192.168.8.15 Bcast:192.168.56.255 Mask:255.255.255.0

遠端執行腳本測試

遠端更新檔案内容
ssh [email protected] “sed -i /‘s#1.4#1.5#’ /data/codes/django/views.py”
遠端檢視腳本
ssh [email protected] “ls /data/scripts”
遠端執行腳本(遠端執行打包指令)
ssh [email protected] “/bin/bash /data/scripts/tar_code.sh”
遠端檢查更新效果
ssh [email protected] “zcat /data/codes/django.tar.gz”

8.2 大型腳本編寫

本地是指線上伺服器主機(192.168.8.14)

我們先來回顧一下代碼釋出流程圖

編寫大型腳本有一個流程:

一、腳本架構

二、指令填充

三、完善功能

增加日志功能
增加鎖檔案功能
增加主函數邏輯
增加參數安全措施

8.2.1 腳本架構

為什麼?

1、指令多

2、功能多

3、不好組合

需求:

先将腳本所涉及的所有業務流程跑通

方案:

使用函數來展現

腳本實施:

#!/bin/bash

# 功能:打包代碼

# 腳本名:deploy.sh

# 作者:itcast

# 版本:V 0.1

# 聯系方式:www.itcast.cn

# 擷取代碼

get_code(){

echo “擷取代碼”

}

# 打包代碼

tar_code(){

echo “打包代碼”

}

# 傳輸代碼

scp_code(){

echo “傳輸代碼”

}

# 關閉應用

stop_serv(){

echo “關閉應用”

echo “關閉nginx應用”

echo “關閉django應用”

}

# 解壓代碼

untar_code(){

echo “解壓代碼”

}

# 放置代碼

fangzhi_code(){

echo “放置代碼”

echo “備份老檔案”

echo “放置新檔案”

}

# 開啟應用

start_serv(){

echo “開啟應用”

echo “開啟django應用”

echo “開啟nginx應用”

}

# 檢查

check(){

echo “檢查項目”

}

# 部署函數

deploy_pro(){

get_code

tar_code

scp_code

stop_serv

untar_code

fangzhi_code

start_serv

check

}

# 主函數

main(){

deploy_pro

}

# 執行主函數

main

8.2.2 指令填充

需求:

在流程跑通的情況下,執行完整的代碼部署過程

方案:

在腳本架構中,填寫執行成功的指令

腳本實施:

#!/bin/bash

# 功能:打包代碼

# 腳本名:deploy.sh

# 作者:itcast

# 版本:V 0.2

# 聯系方式:www.itcast.cn

# 擷取代碼

get_code(){

echo “擷取代碼”

}

# 打包代碼

tar_code(){

echo “打包代碼”

ssh [email protected] “/bin/bash /data/scripts/tar_code.sh”

}

# 傳輸代碼

scp_code(){

echo “傳輸代碼”

cd /data/codes

[ -f django.tar.gz ] && rm -f django.tar.gz

scp [email protected]:/data/codes/django.tar.gz ./

}

# 關閉應用

stop_serv(){

echo “關閉應用”

echo “關閉nginx應用”

/data/server/nginx/sbin/nginx -s stop

echo “關閉django應用”

kill $(lsof -Pti :8000)

}

# 解壓代碼

untar_code(){

echo “解壓代碼”

cd /data/codes

tar xf django.tar.gz

}

# 放置代碼

fangzhi_code(){

echo “放置代碼”

echo “備份老檔案”

mv /data/server/itcast/test1/views.py /data/backup/views.py-$(date

+%Y%m%d%H%M%S)

echo “放置新檔案”

mv /data/codes/django/views.py /data/server/itcast/test1/

}

# 開啟應用

start_serv(){

echo “開啟應用”

echo “開啟django應用”

source /data/virtual/venv/bin/activate

cd /data/server/itcast/

python manage.py runserver >> /dev/null 2>&1 &

deactivate

echo “開啟nginx應用”

/data/server/nginx/sbin/nginx

}

# 檢查

check(){

echo “檢查項目”

netstat -tnulp | grep ‘:80’

}

8.2.3 增加日志功能

需求:

1、追蹤記錄

2、資料說話

方案:

增加日志功能

1、日志檔案

/data/logs/deploy.log

2、日志格式

日期 時間 腳本名稱 步驟

知識點:
檔案内容追加: >>

日期:date +%F

時間:date +%T

腳本:$0

腳本實施:

#!/bin/bash
LOG_FILE=’/data/logs/deploy.log’
# 增加日志功能
write_log(){
DATE=$(date +%F) //指令變量:每執行腳本都會執行此步驟
TIME=$(date +%T)
buzhou="$1"
echo “${DATE} ${TIME} $0 : ${buzhou}” >> “${LOG_FILE}”
}
# 擷取代碼
get_code(){
write_log “擷取代碼”
}
# 打包代碼
tar_code(){
write_log “打包代碼”
}
# 傳輸代碼
scp_code(){
write_log “傳輸代碼”
}
# 關閉應用
stop_serv(){
write_log “關閉應用”
write_log “關閉nginx應用”
write_log “關閉django應用”
}
# 解壓代碼
untar_code(){
write_log “解壓代碼”
}
# 放置代碼
fangzhi_code(){
write_log “放置代碼”
write_log “備份老檔案”
write_log “放置新檔案”
}
# 開啟應用
start_serv(){
write_log “開啟應用”
write_log “開啟django應用”
write_log “開啟nginx應用”
}
# 檢查
check(){
write_log “檢查項目”
}

8.2.4 增加鎖檔案功能

需求:

同一時間段内,隻允許有一個使用者來執行這個腳本

如果腳本執行的時候,有人在執行,那麼輸出報錯:

腳本 deploy.sh 正在運作,請稍候…

設計:

1、鎖檔案 /tmp/deploy.pid

2、存在鎖檔案時候,輸出報錯資訊

3、腳本執行的時候,需要建立鎖檔案

4、腳本執行結束的時候,需要删除鎖檔案

知識點:

條件和結果: 雙分支if語句
檔案表達式: -f file_name
驗證表達式: [ 表達式 ]
建立和删除指令:touch、rm -f

腳本實施

#!/bin/bash
PID_FILE=’/tmp/deploy.pid’
# 增加鎖檔案功能
add_lock(){
echo “增加鎖檔案”
touch “${PID_FILE}”
write_log “增加鎖檔案”
}
# 删除鎖檔案功能
del_lock(){
echo “删除鎖檔案”
rm -f “${PID_FILE}”
write_log “删除鎖檔案”
}
# 部署函數
deploy_pro(){
add_lock
del_lock
}
# 腳本報錯資訊
err_msg(){
echo “腳本 $0 正在運作,請稍候…”
}
# 主函數
main(){
if [ -f “${PID_FILE}” ]
then
err_msg
else
deploy_pro
fi
}
# 執行主函數
main

8.2.5 腳本流程知識點填充

需求:

如果我給腳本輸入的參數是deploy,那麼腳本才執行,否則的話,提示該腳本的使用幫助資訊,然後退出

提示資訊:腳本 deploy.sh 的使用方式: deploy.sh [ deploy ]

分析:

1、腳本傳參,就需要在腳本内部進行調用參數

2、腳本的幫助資訊

3、腳本内容就需要對傳參的内容進行判斷

知識點:

1、shell内置變量:$n

2、幫助資訊: 簡單函數定義和調用

3、内容判斷: 多if語句或者case語句

方案:

1、腳本的傳參

腳本執行:bash deploy.sh deploy
位置參數的調用: $1

2、腳本的幫助資訊

定義一個usage函數,然後調用。
提示資訊格式:
腳本 deploy.sh 的使用方式: deploy.sh [ deploy ]

3、内容判斷

main函數體調用函數傳參: $1
在main函數中,結合case語句,對傳入的參數進行比對
如果傳入參數内容是"deploy",那麼就執行代碼部署流程
如果傳入參數内容不是"deploy",那麼輸出腳本的幫助資訊
if語句和case語句的結合
if語句在外,case語句在内
case語句在外,if語句在内

腳本實施

#!/bin/bash
# 腳本幫助資訊
usage(){
echo “腳本 $0 的使用方式: $0 [deploy]”
exit
}
# 主函數
main(){
case “$1” in
“deploy”)
if [ -f “${PID_FILE}” ]
then
err_msg
else
deploy_pro
fi
;;
*)
usage
;;
esac
}
# 執行主函數
main $1

8.2.6 輸入參數安全優化

需求:

對腳本傳入的參數的數量進行判斷,如果參數數量不對,提示腳本的使用方式,然後退出

分析:

1、腳本參數數量判斷

2、條件判斷

數量對,那麼執行主函數
數量不對,那麼調用腳本幫助資訊

知識點:

1、腳本參數數量判斷

shell内置變量: $#
條件表達式: [ $# -eq 1 ]

2、條件判斷:

雙分支if語句

方案:

1、雙分支if語句 + main函數調用

腳本實施

#!/bin/bash
# 執行主函數
if [ $# -eq 1 ]
then
main $1
else
usage
fi

8.3腳本調試功能

我們介紹腳本調試的時候呢,主要分三種方式來介紹:

-n 檢查腳本中的文法錯誤

-v

先顯示腳本所有内容,然後執行腳本,結果輸出,如果執行遇到錯誤,将錯誤輸出。

-x 将執行的每一條指令和執行結果都列印出來

8.4 生産腳本編寫總結

8.4.1 簡單腳本編寫總結

1、手工執行的指令一定要可執行

2、指令簡單羅列

3、固定的内容變量化

4、功能函數化

8.4.2 複雜腳本編寫總結

1、手工執行的指令一定要可執行

2、根據釋出流程編寫腳本的架構

3、将手工執行的指令填充到對應的架構函數内部

4、增加日志功能,友善跟蹤腳本曆史執行記錄

5、主函數中邏輯流程控制好

6、設計安全的方面:

增加鎖檔案,保證代碼釋出的過程中不受幹擾,

輸入參數數量

輸入參數比對

腳本幫助資訊

7、調試腳本

8.4.3 注意事項:

1、指令一定要保證能正常執行

2、成對的符号,要成對寫,避免丢失

3、函數調用,

寫好函數後,一定要在主函數中進行調用

4、避免符号出現中文

5、指令變量的寫法一定要規範

6、固定的内容一定要變量實作,友善以後更改

7、日志的輸出

8、腳本的傳參和函數的傳參要差別對待