day074 SHELL入門及進階

SHELL快速入門

學習目標

  1. 瞭解運維和自動化運維是什麼及工作實現方式

  2. 記住shell是什麼,說出shell的兩分類

  3. 知道shell腳本的特點是什麼

運維

運維是什麼?

  • 運維是公司的一個技術崗位,負責程序的規劃,管理,安全,優化等方面的工作

運維的工作範圍

這裏寫圖片描述

以dailyfresh項目爲例:

  1. 規劃:我們需要多少資源來支持項目的運行
  2. 管理:項目運行過程中的所有內容都要管理起來
  3. 流程規範:所有操作都形成制度,提高工作效率
  4. 平臺:大幅度提高工作效率
  5. 監控:實時查看項目運行狀態指標
  6. 告警:狀態指標異常,告知功能工作人員處理
  7. 安全:網站運營安全措施
  8. 優化:保證用戶訪問網站的體驗很好
  9. 考覈:權責分配,保證利益

自動化運維

  • 就是將以上工作以代碼化,自動化的方式運行

怎麼進行自動化運維呢?

  • 工具,腳本

常見的自動化運維腳本有哪些呢?

  • shell腳本和其他語言的開發腳本
  • shell腳本就是shell編程的一種具體實現

SHELL簡介

shell是什麼?

這裏寫圖片描述

  • shell是命令解釋器
  • shell出於系統和應用之間,負責將應用程序的命令解釋給系統,也負責將系統的命令執行的結果解釋給應用程序,在計算機中,是應用程序與系統之間交流的橋樑。

shell的分類

  • shell分爲圖形界面shell和命令行shell
    • 圖形界面shell就是桌面
    • 命令行shell爲:windows:cmd.exe;linux系統:sh/csh/ksh/bash…

查看當前系統的shell類型:

echo $SHELL

查看當前系統環境支持的shell:

cat /etc/shells

shell腳本

shell腳本使用方式

    1. 手工方式:直接在終端數據腳本代碼,輸入完一行,enter鍵確認,輸出結果,再輸入下一條指令,依次執行
    1. 腳本文件定義方式:新建一個文件(.sh),在文件中輸入想要執行的所有代碼,保存後,執行這個文件即可
  • 示例:
    vim 01_first_shell_script.sh

01_first_shell_script.sh

#/bin/bash
# 這是腳本示例文件
echo "hello"
echo "world"

腳本執行效果:

/bin/bash  01_first_shell_script.sh
hello
woeld

總結

  • shell是命令解釋器
  • shell分爲圖形界面shell和命令行shell
  • shell是可執行命令的組合

SHELL基礎知識

學習目標

  1. 掌握shell腳本的標準執行方法
  2. 掌握shell腳本的開發規範和開發小技巧
  3. 說出shell中常用的三種變量及其特點
  4. 應用shell的變量實現特定功能

shell腳本

學習目標

  1. 瞭解shell腳本的內容小技巧
  2. 掌握shell腳本的標準執行方法
  3. 掌握shell腳本的開發規範和開發小技巧

創建腳本

  • 創建工具:vi/Vim
  • 腳本命名:有意義
  • 腳本內容:各種可執行的命令
  • 註釋內容:
    • 單行註釋:# 後面跟的就是單行註釋
    • 多行註釋::<
#!/bin/bash
# 這是單行註釋
echo "這是普通的shell腳本命令"
:<<!這是多行
註釋!
:<<a這是第二種多行
註釋的方式a
~               

執行腳本文件

/bin/bash 02_zhshi.sh
這是普通的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、腳本命名要有意義,文件後綴是.sh
2、腳本文件首行是而且必須是腳本解釋器
#!/bin/bash
3、腳本文件解釋器後面要有腳本的基本信息等內容
腳本文件中儘量不用中文註釋;
儘量用英文註釋,防止本機或切換系統環境後中文亂碼的困擾
常見的註釋信息:腳本名稱、腳本功能描述、腳本版本、腳本作者、聯繫方式等
4、腳本文件常見執行方式:bash 腳本名
5、腳本內容執行:從上到下,依次執行
6、代碼書寫優秀習慣;
1)成對內容的一次性寫出來,防止遺漏。
如:()、{}、[]、''、``、""
2)[]中括號兩端要有空格,書寫時即可留出空格[ ],然後再退格書寫內容。
3)流程控制語句一次性書寫完,再添加內容
7、通過縮進讓代碼易讀;(即該有空格的地方就要有空格)

總結

  1. shell腳本命名:有意義,便於知道腳本的目的
  2. shell腳本的註釋:單行(#)、多行(:<<字符… 字符)
  3. shell腳本標準執行方法: /bin/bash /path/to/script-name
  4. shell腳本開發規範重點:2-4-5
  5. shell腳本開發小技巧:6-7

變量

學習目標

1、說出變量的定義和目的
2、掌握本地變量的查看格式和使用場景
3、掌握全局變量的查看/定義格式和使用場景
4、掌握普通變量的標準查看方法
5、說出shell內置變量的特性和分類
6、掌握shell內置變量的使用場景

什麼是變量

  • 變量包括兩個部分
    • 變量名:不變的
    • 變量值:變化的
  • 我們一般說的變量,指的是變量名

  • 在shell中,變量分爲三類:

    • 本地變量
    • 全局變量
    • 內置變量

本地變量

本地變量是什麼?

  • 本地變量就是在某個環境下才能生成的變量,作用範圍小
  • 本地變量包含兩種:
    • 普通變量
    • 命令變量

普通變量

定義方式
方式一:
變量名=變量值
重點:
變量值必須是一個整體,中間沒有特殊字符
方式二:
變量名='變量值'
重點:
我看到的內容,我就輸出什麼內容
方式三:
變量名="變量值"
重點:
如果變量值範圍內,有可以解析的變量A,那麼首先解析變量A,將A的結果和其他內容組合成一個整體,重
新賦值給變量B
習慣:
**數字不加引號,其他默認加雙引號**
示例:
   echo $var
   var=666
   echo $var
   var='666'
   echo $var
   var="666"
   echo $var
   var=666 aaa
   var='666 aaa'
   echo $var
   var="666 aaa"
   echo $var
   var1=bbb
   echo $var1
   var2='$var $var1'
   echo $var2
   var2="$var $var1"
   echo $var2

命令變量

  • 命令變量是指變量的值是一個命令的變量定義方式
  • 定義方式有兩種:

    • 變量名=`命令`
    • 變量名=$(命令),推薦使用此形式
  • 執行流程:

      1. 執行命令
      1. 將命令執行後的結果賦值給變量名

示例:

 a=$(echo "this is a test")
 echo $a
 a=`echo "this is a test"`
 echo $a

全局變量

全局變量是什麼?

  • 在當前系統環境下都能生效的變量

env 只顯示全局變量

定義全局變量

方法一:
變量=值
export 變量
方法二:(最常用)
export 變量=值

示例:

env

export A=1121
env | grep A=1121

變量查看和取消

查看變量

方式一:
$變量名
場景:
私下裏,在命令行/腳本中使用
圖省事
方式二:
"$變量名"
場景:
私下裏,在命令行/腳本中使用
圖省事
方式三:
${變量名}
場景:
echo " dsa dsafsa dsafsa ${變量名} f "
使用頻率較高
方式四:
"${變量名}"
場景:
標準使用方式

取消變量

unset 變量名

示例:

“`
a=1121
export A=1121
env | grep A=1121
env | grep a=1121

echo “Aecho {a}”

“`

shell內置變量

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

和腳本文件有關

符號意義
$0 獲取當前執行的shell腳本文件名
$n 獲取當前執行的shell腳本的第n個參數值,n=1..9,當n爲0時表示腳本的文件名,如果n大於9就要用大
括號括起來${10}
$# 獲取當前shell命令行中參數的總個數
$? 獲取執行上一個指令的返回值(0爲成功,非0爲失敗)

示例:

#!/bin/bash
# 獲取當前腳本文件名 $0
echo "當前文件名稱: get_name.sh"
echo "當前文件名稱: $0"      

#!/bin/bash
# 獲取第 n 個位置的內容 $n
echo "第 1 個位置的參數內容是: $1"
echo "第 2 個位置的參數內容是: $2"
echo "第 4 個位置的參數內容是: $4"
echo "第 3 個位置的參數內容是: $3"

#!/bin/bash
# 獲取腳本參數總數量 $#
echo "當前腳本傳入的參數總個數是: $#"

字符串精確截取

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

如:

${file:0:5} 從第1個字符開始,截取5個字符
${file:5:5} 從第6個字符開始,截取5個字符
${file:0-6:3} 從倒數第6個字符開始,截取之後的3個字符

示例:

 a="abcdefg"
 b=${a:0:6}
 echo $b
 b=${a:1:6}
 echo $b
 b=${a:0-3:6}
 echo $b

默認值相關

場景1:
  • 變量a如果有內容,那麼就輸出a的變量值
    變量a如果沒有內容,那麼就輸出默認的內容

  • 格式:${變量名:-默認值}

示例:
- 如果我輸入的參數爲空,那麼輸出內容是”您選擇的套餐是: 套餐1”
如果我輸入的參數爲n,那麼輸出內容是”您選擇的套餐是: 套餐n”

#!/bin/bash
# 測試變量的默認值相關
a=$1
echo "您選擇的套餐是是${a:-1}"
場景二:
  • 無論變量a是否有內容,都輸出默認值
  • 格式:${變量名+默認值}

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

#!/bin/bsh
b=$2
echo "法定結婚年齡爲:${b+22}"

總結:

變量: 變量值+變量名
shell三種變量: 本地+全局+內置
本地變量種類:
普通變量定義格式: 變量值'變量值' "變量值"
命令變量定義格式: `命令` $(命令)
命令變量:
專用查看命令:env
標準定義格式:export 變量名=變量值
普通變量查看方法:$變量名"$變量名" ${變量名} "${變量名}"
變量取消專用命令:unset
shell內置變量三種類:
文件相關: $0 $n $# $?
字符串相關: ${變量名:起始位置:截取長度}
默認值相關: ${變量名:-默認值} ${變量名+默認值}

SHELL進階

學習目標:

  1. 掌握標準測試語句的格式和特點
  2. 掌握常見條件/計算表達式的格式及使用場景
  3. 掌握linux常見符號種類和使用場景
  4. 掌握linux常用命令和使用關鍵點

表達式

學習目標

  1. 瞭解常用的兩種測試語句
  2. 掌握標準測試語句的格式和特點
  3. 說出常用條件表達式種類
  4. 掌握2種邏輯表達式的特點和使用場景
  5. 掌握3種文件表達式的特點和使用場景
  6. 瞭解4種數字表達式和2種字符串表達式的特點和使用場景
  7. 應用2種計算表達式

測試語句

  • Shell環境根據命令執行後的返回狀態值($?)來判斷是否執行成功,當返回值爲0,表示成功,值爲其他時,表示失敗
  • 使用專門的測試工具—test命令,可以對特定條件進行測試,並根據返回值來判斷條件是否成立(返回值0爲成立)
  • 測試語句形式
    • A: test 條件表達式
    • B: [ 條件表達式 ],推薦使用
    • 格式注意:
      以上兩種方法的作用完全一樣,後者爲常用。
      但後者需要注意方括號[、]與條件表達式之間至少有一個空格。
      test跟[] 的意思一樣
      條件成立,狀態返回值是0
      條件不成立,狀態返回值是1

條件表達式

  • 我們這部分內容主要是介紹,測試語句中的[ 條件表達式] 這一部分,測試的結果使用echo $? 來查看

邏輯表達式

  • 邏輯表達式一般用於判斷多個條件之間的依賴關係。
  • 常見的邏輯表達式有: && 和||
&&
  • 命令1 && 命令2
  • 如果命令1執行成功,那麼我才執行命令2
    如果命令1執行失敗,那麼命令2也不執行– 夫唱婦隨
||
  • 命令1 || 命令2
  • 如果命令1執行成功,那麼命令2不執行
    如果命令1執行失敗,那麼命令2執行– 對着幹

示例:

[ 1=1 ] && echo "&&ok"
[ 1=2 ] && echo "$$nook"
[ 1=1 ] || echo "||ok"
[ 1=2 ] || echo "||nook"

&&ok
16057nook

文件表達式

  • -f 判斷後面的內容是否是一個文件
  • -d 判斷後面的內容是否是一個目錄
  • -x 判斷後面的內容是否是一個可執行文件

示例:

#!/bin/bash
# 測試文件表達式:-f, -d, -x
# -f 判斷是否爲一個文件
[ -f 06_file_exp.sh ] && echo "ok"

# -d 判斷是否爲一個目錄
[ -d 06_file_exp.sh ] || echo "不是一個目錄"

# -x 判斷是否爲一個可執行文件
[ -x 06_file_exp.sh ] && echo "是一個可執行文件"


ok
不是一個目錄

數值操作符

  • 主要根據給定的兩個值,判斷第一個與第二個數的關係,如是否大於、小於、等於第二個數。
  • 常見選項如下:
    • n1 -eq n2 相等
    • n1 -gt n2 大於
    • n1 -lt n2 小於
    • n1 -ne n2 不等於

示例:

#!/bin/bash
# 測試數字比較操作符:-eq;-lt;-gt;-ne
[ 1 -eq 1 ] && echo '相等'
[ 1 -lt 2 ] && echo '小於'
[ 2 -gt 1 ] && echo '大於'
[ 2 -ne 1 ] && echo '不等於'

相等
小於
大於
不等於

字符換比較

  • str1 == str2 str1和str2字符串內容一致
  • str1 != str2 str1和str2字符串內容不一致

示例:

#!/bin/bash
# 測試字符串之間的比較:str1==str2,str1!=str2
[ 'michael'=='michel' ] && echo '相等'
[ 'michael'!='jackson' ] && echo '不相等'

相等
不相等

計算表達式

  • 計算表達式,簡單來說就是對具體的內容進行算數計算
  • 格式:
    • 方式一:
      (()) (( 計算表達式)),推薦使用
  • 方式二:
    let let 計算表達式
  • 注意:
    $(())中只能用+-*/和()運算符,並且只能做整數運算

示例:

echo $((100/5))
20

i=1
let i=i+1
echo $i
2

總結:

  • 標準的測試語句:[ 條件表達式 ]
  • 四種條件表達式:
    • 邏輯: &&(同林鳥) ||(對着幹)
    • 文件: -f -d -x
    • 數字: -ge -gt -lt -ne
    • 字符串: == !=
  • 兩種計算表達式:$((計算表達式)) let 變量名a=變量名a+1

linux常見符號

學習目標:

  1. 掌握兩種重定向符號的格式和使用場景
  2. 掌握管道符的特點和使用
  3. 掌握後臺展示符號的意義和作用
  4. 掌握信息符號的作用和使用場景

重定向符號

  • 在shell腳本中有兩種常見的重定向符號> 和>>
    • > 表示將符號左側的內容,以覆蓋的方式輸入到右側文件中
    • >> 表示將符號左側的內容,以換行添加的方式追加到右側的文件中

示例

echo 'michael' > test.sh
cat test.sh
michael

echo 'jackson' > test.sh
cat test.sh
jackson

echo 'jackson' >> test.sh
cat test.sh
jackson
jackson

管道符號

  • |,用來將|左邊的信息傳遞到|右邊的工具
  • 使用格式:命令1 | 命令2
    • 管道符左側命令1 執行後的結果,傳遞給管道符右側的命令2使用

示例:

env | grep SHELL

SHELL=/bin/bash

其他符號

後臺展示符號&

  • 就是將一個命令從前臺轉到後臺執行
  • 格式:命令 &

示例:

sleep 4
卡住4sleep 10 &
後臺運行,不耽誤其他操作

全部信息符號2>&1

符號詳解:
  • 1 表示正確輸出的信息
  • 2 表示錯誤輸出的信息
  • 2>&1 代表所有輸出的信息

示例:

 bash 10_output_msg.sh 1 > zhengque 
 cat zhengque
 bash 10_output_msg.sh 2 > cuowu
 cat cuowu

 bash 10_output_msg.sh > all_msg 2>&1
 cat all_msg

linux系統垃圾桶

  • /dev/null 是linux下的一個設備文件,
  • 這個文件類似於一個垃圾桶,特點是:容量無限大

示例:

rm zehngque > /dev/null

本節內容小結:

  • 重定向符號:
    • >(覆蓋) >>(追加)
  • 管道符:
    • 信息傳遞, 從左到右
  • 其他符號:
    • 後臺展示符號: &
    • 信息提取符號: 2>&1
    • 垃圾桶符號: /dev/null

常見命令詳解

本節學習目標:

  1. 掌握grep 命令的格式和常用參數意義和使用場景
  2. 掌握sed 命令的格式和常用參數意義和使用場景

grep 命令詳解

定義

  • grep命令是我們常用的一個強大的文本搜索命令

命令格式

  • 命令格式:grep [參數] [關鍵字] <文件名>
    • 注意:我們在查看某個文件的內容的時候,是需要有<文件名>
      grep命令在結合|(管道符)使用的情況下,後面的<文件名>是沒有的
      可以通過grep –help 查看grep的幫助信息

參數解釋

  • 參數詳解
    • -c:只輸出匹配行的計數。
    • -n:顯示匹配行及行號。
    • -v:顯示不包含匹配文本的所有行。

示例:
模板文件:

find.txt

nihao aaa
nihao AAA
NiHao bbb
nihao CCC
  • -c :輸出匹配到aaa的個數

grep -c aaa find.txt

1

  • -n: 輸出匹配內容,同時顯示行號
grep -n CCC find.txt

4:nihao CCC
  • -v:匹配到的內容部輸出,輸出不匹配的內容
grep -v ni find.txt

NiHao bbb

sed 命令詳解

定義

  • seds是行文件編輯工具。因爲它編輯文件是以行爲單位的.

命令格式

  • sed [參數] ‘<匹配條件> [動作]’ [文件名]

參數解釋

  • 參數爲空表示sed的操作效果,實際上不對文件進行編輯
  • -i 表示對文件進行編輯
  • 注意:mac版本的bash中使用-i參數,必須在後面單獨加個東西: -i ”

匹配條件

  • 匹配條件分爲兩種:數字行號或者關鍵字匹配
  • 關鍵字匹配格式:
    ‘/關鍵字/’
    • 注意:
      隔離符號/ 可以更換成@、#、!等符號
      根據情況使用,如果關鍵字和隔離符號有衝突,就更換成其他的符號即可。

動作詳解

  • -a 在匹配到的內容下一行增加內容
  • -i 在匹配到的內容上一行增加內容
  • -d 刪除匹配到的內容
  • -s 替換匹配到的內容
  • 注意:
    上面的動作應該在參數爲-i的時候使用,不然的話不會有效果

替換命令演示

  • 關於替換,我們從三個方面來學習:
    行號、列號、全體
  • 命令格式:
    sed -i [替換格式] [文件名]
  • 注意:替換命令的寫法
    • ’s###’ —> ‘s#原內容##’ —> ‘s#原內容#替換後內容#’
    • 樣式一:
      sed -i ‘行號s#原內容#替換後內容#列號’ [文件名]
    • 樣式二:
      sed -i ‘s#原內容#替換後內容#g’ [文件名]

示例:

模板文件

sed_test.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_test.txt

    nihao SED sed sed
    nihao SED sed sed
    nihao SED sed sed
    
  • 替換全部匹配內容

    • sed -i ‘s#原內容#替換後內容#g’ 文件名

    替換全部sed爲des

    sed -i '' s#sed#des#g sed_test.txt

    nihao des des des
    nihao des des des
    nihao des des des
    
  • 指定行號替換首個匹配內容

    • sed -i ” 行號s#原內容#替換後的內容# 文件名

    替換第2行的首個SED爲sed

    sed -i '' 2s#SED#sed# sed_test.txt

    nihao SED SED SED
    nihao sed SED SED
    nihao SED SED SED
    
  • 首行指定列號替換匹配內容

    • sed -i ‘s#原內容#替換後內容#列號’ 文件名

    替換每行的第2個SED爲sed

    sed -i '' s#SED#sed#2 sed_test.txt

    nihao SED sed SED
    nihao sed SED sed
    nihao SED sed SED
    
  • 指定行號列號匹配內容

    • sed -i ‘行號s#原內容#替換後內容#列號’ 文件名

    替換第3行的第2個SED爲sed

    sed -i '' 3s#SED#sed#2 sed_text.txt

    nihao SED sed SED
    nihao sed SED sed
    nihao SED sed sed
    

增加操作

在指定行號的下一行增加內容
  • 格式:
    • sed -i ‘行號a\增加的內容’ 文件名
    • 如果增加多行,可以在行號位置寫個範圍值,彼此間使用逗號隔開,例如
      sed -i ‘1,3a\增加內容’ 文件名

示例: 在第二行下增加一行內容“insert-2”

sed -i '2a\zengjia-2' sed_text.txt
cat sed.txt
nihao SED sed SED
nihao sed SED
zengjia-2
nihao SED sed sed

指定1~3每行都增加內容

sed -i '1,3a\tongshi-2' sed_text.txt
cat sed_text.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,3i\增加內容’ 文件名

示例:在第一行插入一行內容

sed -i '1i\insert-1' sed_text.txt
cat sed_text.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’ 文件名

示例:刪除第5行的內容

sed -i '5d' sed_text.txt
cat sed_text.txt

insert-1
nihao SED sed SED
tongshi-2
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed

刪除第3-5行內容

sed -i '3,5d' sed.txt
cat sed.txt

insert-1
nihao SED sed SED
tongshi-2
nihao SED sed sed
發佈了69 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章