1. 程式人生 > >SHELL自動化運維

SHELL自動化運維

第1章 shell指令碼

1.1 shell 簡介

shell 的定義

1. 在電腦科學中,Shell就是一個命令直譯器。
2. shell是位於作業系統和應用程式之間,是他們二者最主要的介面,shell負責把應用程式的輸入命令資訊解釋給作業系統,將作業系統指令處理後的結果解釋給應用程式。

**總結:**shell就是在作業系統和應用程式之間的一個命令翻譯工具。

1.2 shell的分類

shell分兩大類

1. 圖形介面:就是我們常說的桌面
2. 命令列:
    windows系統:cmd.exe	 命令提示字元
    linux系統:sh / csh / ksh / bash
/ ...

檢視系統shell 資訊

  1. 檢視當前系統的shell型別
[email protected]:/home/kungs# echo $SHELL
/bin/bash
  1. 檢視當前系統環境支援的shell
[email protected]:/home/kungs# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen

1.3 shell指令碼

1. shell 使用方式

1. 手工方式:
	手工敲擊鍵盤,在shell的命令列輸入命令,按Enter後,執行通過鍵盤輸入的命令,然後shell返回並顯示命令執行的結果.
重點:逐行輸入命令、逐行進行確認執行

2. 指令碼方式:
	就是說我們把手工執行的命令a,寫到一個指令碼檔案b中,然後通過執行指令碼b,達到執行命令a的效果.

2. shell 指令碼定義

當可執行的Linux命令或語句不在命令列狀態下執行,而是通過一個檔案執行時,稱檔案為shell指令碼。

3. shell 指令碼示例

# 1. 手工方法 
[email protected]:/home/kungs# echo 'kungs'
kungs

# 2. 指令碼方法
[email protected]:/home/kungs# cat kungs.sh 
#!/bin/bash
# 這是一個臨時測試指令碼
echo 'kungs'
echo 'kungs love you'

第2章 SHELL基礎知識

2.1 shell指令碼

2.1.1 建立指令碼

建立工具:vi/vim
指令碼命名:shell指令碼的命名要有意義,方便我們通過指令碼名,來知道此檔案用途
指令碼內容:各種可執行的命令
註釋內容:
	1.單行註釋:除了首行的'#'不是註釋外,其他行內容的首個字元是'#',
	2.多行註釋:多行註釋有兩種方法:':<<! ... !'':<<字元 ... 字元'

例項:

[email protected]:/home/kungs# cat zhushi.sh 
#!/bin/bash
# 單行註釋

echo '下一行是多行註釋'
:<<!
echo '1'
echo '2'
echo '3'
!
echo '4'
[email protected]:/home/kungs# bash zhushi.sh 
下一行是多行註釋
4

2.1.2 指令碼執行

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.3 指令碼開發規範

1、指令碼命名要有意義,檔案字尾是.sh
2、指令碼檔案首行是而且必須是指令碼直譯器
	#!/bin/bash
3、指令碼檔案直譯器後面要有指令碼的基本資訊等內容
	- 指令碼檔案中儘量不用中文註釋;儘量用英文註釋,防止本機或切換系統環境後中文亂碼的困擾
	- 常見的註釋資訊:指令碼名稱、指令碼功能描述、指令碼版本、指令碼作者、聯絡方式等
4、指令碼檔案常見執行方式:bash 指令碼名
5、指令碼內容執行:從上到下,依次執行
6、程式碼書寫優秀習慣;
	1)成對內容的一次性寫出來,防止遺漏。
		如:(){}[]''、``、""
	2)[]中括號兩端要有空格,書寫時即可留出空格[    ],然後再退格書寫內容。
	3)流程控制語句一次性書寫完,再新增內容
7、通過縮排讓程式碼易讀;(即該有空格的地方就要有空格)

2.2 變數

2.2.1 什麼是變數

變數名	: 不變的
變數值	: 變化的

2.2.2 本地變數

本地變數是什麼?

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

本地變數包含兩種:普通變數命令變數

1. 普通變數:

普通變數的定義方式有如下三種:

方式一:
    變數名=變數值
    重點:變數值必須是一個整體,中間沒有特殊字元       
方式二:
    變數名='變數值'
    重點:我看到的內容,我就輸出什麼內容   
方式三:
    變數名="變數值"
    重點:如果變數值範圍內,有可以解析的變數A,那麼首先解析變數A,將A的結果和其他內容組合成一個整體,重新賦值給變數B
習慣:
數字不加引號,其他預設加雙引號

例:

[email protected]:/home/kungs# kungs=nihao222
[email protected]:/home/kungs# echo $kungs
nihao222
[email protected]:/home/kungs# kungs='nihao333'
[email protected]:/home/kungs# echo $kungs
nihao333
[email protected]:/home/kungs# kungs="hello555"
[email protected]:/home/kungs# echo $kungs
hello555

2. 命令變數( 熟練)

命令變數有兩種定義方式

方式一:
    變數名=`命令`
    echo $變數名
    注意:
    ` 是反引號
 
方式二(常用的方法):
	變數名=$(命令)
	echo $變數名

例項:

[email protected]:/home/kungs# dir=`pwd`
[email protected]:/home/kungs# echo $dir
/home/kungs
[email protected]:/home/kungs# pwd
/home/kungs
[email protected]:/home/kungs# echo $(pwd)
/home/kungs

2.2.3 全域性變數

在當前系統的所有環境下都能生效的變數。

檢視全域性環境變數命令

env  只顯示全域性變數

定義全域性變數

方法一:
    變數=export 變數
方法二(常用):
	export 變數=

2.2.4 變數檢視和取消

1. 檢視變數:

方法 例項
$變數名 echo $kungs
“$變數名” echo “$kungs”
${變數名} echo ${kungs}
“${變數名}” echo “${kungs}”

2. 取消變數

unset 變數名
例:
unset kungs

2.2.5 shell內建變數

1. 和指令碼檔案有關

符號 意義
$0 獲取當前執行的shell指令碼檔名,包括指令碼路徑
$n 獲取當前執行的shell指令碼的第n個引數值,n=1,…,9,當n為0時表示指令碼的檔名,如果n大於9就要用大括號括起來${10}
$# 獲取當前shell命令列中引數的數量
$? 獲取執行上一個指令的返回值(0為成功,非0為失敗)

例項:

NgandeMacBook-Pro:kungs_shells kungs$ cat get_name1.sh 
#!/bin/bash
# $0 獲取當前指令碼的名稱
echo "指令碼名稱是;get_name.sh"
echo "當前獲取指令碼的名稱是;$0"
NgandeMacBook-Pro:kungs_shells kungs$ bash get_name1.sh 
指令碼名稱是;get_name.sh
當前獲取指令碼的名稱是;get_name1.sh

NgandeMacBook-Pro:kungs_shells kungs$ cat get_args.sh 
#!/bin/bash
# $n  獲取第n個位置的引數
echo "第一個位置引數是:$1"
NgandeMacBook-Pro:kungs_shells kungs$ bash get_args.sh
第一個位置引數是:
NgandeMacBook-Pro:kungs_shells kungs$ bash get_args.sh a
第一個位置引數是:a
NgandeMacBook-Pro:kungs_shells kungs$ cat get_args1.sh 
#!/bin/bash
# $n  獲取第n個位置的引數
echo "第一個位置引數是:$1"
echo "第二個位置引數是:$2"
echo "第三個位置引數是:$3"
echo "第四個位置引數是:$4"
NgandeMacBook-Pro:kungs_shells kungs$ bash get_args1.sh a b c d
第一個位置引數是:a
第二個位置引數是:b
第三個位置引數是:c
第四個位置引數是:d

獲取檔案執行或者命令執行的返回狀態值:

NgandeMacBook-Pro:kungs_shells kungs$ bash hello
bash: hello: No such file or directory
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
127
NgandeMacBook-Pro:kungs_shells kungs$ ls
ceshi-11.sh	ceshi.sh	get_num.sh	moren2.sh	zhengque
ceshi-all	cuowu		grep.txt	nihao.txt	zhushi.sh
ceshi-err	get_args.sh	kungs.sh	sed.txt		zhushi.sh-1
ceshi-ok	get_name1.sh	moren1.sh	tree1
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0

2. 字串精確擷取

格式:${變數名:起始位置:擷取長度}

例項:

NgandeMacBook-Pro:~ kungs$ file=sdfjoermrelcdgid
NgandeMacBook-Pro:~ kungs$ echo $file
sdfjoermrelcdgid
NgandeMacBook-Pro:~ kungs$ echo ${file:0:5}
sdfjo
NgandeMacBook-Pro:~ kungs$ echo ${file::5}
sdfjo
NgandeMacBook-Pro:~ kungs$ echo ${file:5:5}
ermre
NgandeMacBook-Pro:~ kungs$ echo ${file:0-5}
cdgid
NgandeMacBook-Pro:~ kungs$ echo ${file:0-5:3}
cdg

3. 預設值相關

場景一:

1. 變數a如果有內容,那麼就輸出a的變數值
2. 變數a如果沒有內容,那麼就輸出預設的內容

格式:${變數名:-預設值}

例項:

如果我輸入的引數為空,那麼輸出內容是 "您選擇的套餐是: 套餐1"
如果我輸入的引數為n,那麼輸出內容是 "您選擇的套餐是: 套餐 n" 
NgandeMacBook-Pro:kungs_shells kungs$ vim moren1.sh
NgandeMacBook-Pro:kungs_shells kungs$ cat moren1.sh 
#!/bin/bash
# 預設值場景1 有條件的預設值

# 定義一個本地變了,接受指令碼傳參
a="$1"
echo " 您選擇的套餐是:${a:-1} 套餐"
NgandeMacBook-Pro:kungs_shells kungs$ bash moren1.sh 
 您選擇的套餐是:1 套餐
NgandeMacBook-Pro:kungs_shells kungs$ bash moren1.sh 3
 您選擇的套餐是:3 套餐

場景二:

無論變數a是否有內容,都輸出預設值

格式:${變數名+預設值}

例項:

不管我說那個輸出內容是 多少,都輸出 那個輸出內容是 22 歲
NgandeMacBook-Pro:kungs_shells kungs$ vim moren2.sh
NgandeMacBook-Pro:kungs_shells kungs$ cat moren2.sh 
#!/bin/bash
# 預設值場景2,預設值強制生效

# 定義一個本地變了,接受指令碼傳入的引數
a="$1"

echo "輸出內容是:${a+22} 歲"
NgandeMacBook-Pro:kungs_shells kungs$ bash moren2.sh 
輸出內容是:22 歲
NgandeMacBook-Pro:kungs_shells kungs$ bash moren2.sh 3
輸出內容是:22 歲

第3章 SHELL進階

內容

1. 測試語句
2. 表示式(條件+計算)
3. linux常見富豪和命令

3.1 表示式

要使Shell指令碼程式具備一定的“邏輯能力”,面臨的第一個問題就是:區分不同的情況以確定執行何種操作。

學習解決這個問題方法:測試語句

3.1.1 測試語句

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

測試語句形式

A: test 條件表示式,注意後面的等式要有空格

NgandeMacBook-Pro:kungs_shells kungs$ test 1 = 1
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0
NgandeMacBook-Pro:kungs_shells kungs$ test 1 = 3
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
1

B: [ 條件表示式 ]

格式注意:以上兩種方法的作用完全一樣,後者為常用。

但後者需要注意方括號[、]與條件表示式之間至少有一個空格。

test[] 的意思一樣:

  • 條件成立,狀態返回值是0

  • 條件不成立,狀態返回值是1

NgandeMacBook-Pro:kungs_shells kungs$ [ 1 = 1 ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0
NgandeMacBook-Pro:kungs_shells kungs$ [ 1 = 2 ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
1

操作注意:

[]兩側為什麼要有空格

NgandeMacBook-Pro:kungs_shells kungs$ [-x /bin/bash ]
-bash: [-x: command not found
NgandeMacBook-Pro:kungs_shells kungs$ [ 1 = 2]
-bash: [: missing `]'

可以看到:

兩側沒有空格,就會報錯,為什麼呢?因為你不合規範

3.1.2 條件表示式

測試的結果使用 echo $? 來檢視

1. 邏輯表示式:邏輯表示式一般用於判斷多個條件之間的依賴關係。

常見的邏輯表示式有: &&||

1). &&

命令1 && 命令2

1. 如果命令1執行成功,那麼我才執行命令2     --夫唱婦隨
2. 如果命令1執行失敗,那麼命令2也不執行:

例項:

NgandeMacBook-Pro:kungs_shells kungs$ [ 1 = 1 ] && echo "條件成立"
條件成立
NgandeMacBook-Pro:kungs_shells kungs$ [ 1 = 2 ] && echo "條件成立"
NgandeMacBook-Pro:kungs_shells kungs$ 

2). ||

命令1 || 命令2

1. 如果命令1執行成功,那麼命令2不執行           -- 對著幹
2. 如果命令1執行失敗,那麼命令2執行             

​ 例項:

NgandeMacBook-Pro:kungs_shells kungs$ [ 1 = 2 ] || echo "條件不成立"
條件不成立
NgandeMacBook-Pro:kungs_shells kungs$ [ 1 = 1 ] || echo "條件不成立"
NgandeMacBook-Pro:kungs_shells kungs$ 

2. 檔案表示式

1). -f 判斷輸入內容是否是一個檔案

NgandeMacBook-Pro:kungs_shells kungs$ ls
get_args.sh	get_num.sh	moren1.sh	zhushi.sh
get_name1.sh	kungs.sh	moren2.sh	zhushi.sh-1
NgandeMacBook-Pro:kungs_shells kungs$ [ -f moren1.sh ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0
NgandeMacBook-Pro:kungs_shells kungs$ [ -f moren1.sh ] && echo "它是一個普通檔案"
它是一個普通檔案
NgandeMacBook-Pro:kungs_shells kungs$ [ -f moren1.shsad ] && echo "它是一個普通檔案"
NgandeMacBook-Pro:kungs_shells kungs$ 

2). -d 判斷輸入內容是否是一個目錄

NgandeMacBook-Pro:kungs_shells kungs$ ls
get_args.sh	get_num.sh	moren1.sh	tree1		zhushi.sh-1
get_name1.sh	kungs.sh	moren2.sh	zhushi.sh
NgandeMacBook-Pro:kungs_shells kungs$ [ -d tree1 ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0
NgandeMacBook-Pro:kungs_shells kungs$ [ -d tree1 ] && echo "是一個目錄"
是一個目錄
NgandeMacBook-Pro:kungs_shells kungs$ [ -d tree1 ] || echo "不是一個目錄"
NgandeMacBook-Pro:kungs_shells kungs$ [ -d tree11 ] || echo "不是一個目錄"
不是一個目錄

3). -x 判斷輸入內容是否可執行

NgandeMacBook-Pro:kungs_shells kungs$ ls -al
total 64
-rw-r--r--   1 kungs  staff   156 10 29 11:13 moren1.sh
NgandeMacBook-Pro:kungs_shells kungs$ [ -x moren1.sh ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
1
NgandeMacBook-Pro:kungs_shells kungs$ [ -x moren1.sh ] || chmod +x moren1.sh 
NgandeMacBook-Pro:kungs_shells kungs$ ls -alh
total 64
-rwxr-xr-x   1 kungs  staff   156B 10 29 11:13 moren1.sh
NgandeMacBook-Pro:kungs_shells kungs$ [ -x moren1.sh ] && ./moren1.sh 
 您選擇的套餐是:1 套餐

3. 數值操作符(-eq-gt-ltne)

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

n1 -eq n2    相等
n1 -gt n2    大於
n1 -lt n2    小於
n1 -ne n2    不等於

例項:

NgandeMacBook-Pro:kungs_shells kungs$ [ 1 -eq 1 ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0
NgandeMacBook-Pro:kungs_shells kungs$ [ 1 -gt 1 ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
1
NgandeMacBook-Pro:kungs_shells kungs$ [ 1 -lt 2 ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0
NgandeMacBook-Pro:kungs_shells kungs$ [ 1 -ne 2 ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0

4. 字串比較

str1 == str2          str1和str2字串內容一致
str1 != str2          str1和str2字串內容不一致,!表示相反的意思

例項:

判斷字元是否內容一致

NgandeMacBook-Pro:kungs_shells kungs$ [ a == a ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0
NgandeMacBook-Pro:kungs_shells kungs$ [ a == ab ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
1
NgandeMacBook-Pro:kungs_shells kungs$ a=hello
NgandeMacBook-Pro:kungs_shells kungs$ b=nobody
NgandeMacBook-Pro:kungs_shells kungs$ echo $a
hello
NgandeMacBook-Pro:kungs_shells kungs$ echo $b
nobody
NgandeMacBook-Pro:kungs_shells kungs$ [ "${a}" == "${b}" ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
1
NgandeMacBook-Pro:kungs_shells kungs$ [ "${a}" != "${b}" ]
NgandeMacBook-Pro:kungs_shells kungs$ echo $?
0

3.1.3 計算表示式($(( 計算表示式 ))let)

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

格式:

方式一:
	$(( 計算表示式 ))
方式二:
	let
	注意:$(())中只能用+-*/和()運算子,並且只能做整數運算

計算表示式

例項:

$((變數名a+1)) 注意:表示式範圍內,空格不限制

NgandeMacBook-Pro:kungs_shells kungs$ echo $((1+1))
2
NgandeMacBook-Pro:kungs_shells kungs$ echo $((2+2))
4
NgandeMacBook-Pro:kungs_shells kungs$ echo $((2*3))
6

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

NgandeMacBook-Pro:kungs_shells kungs$ let a=1+1
NgandeMacBook-Pro:kungs_shells kungs$ echo $a
2
NgandeMacBook-Pro:kungs_shells kungs$ let a=1+5
NgandeMacBook-Pro:kungs_shells kungs$ echo $a
6
NgandeMacBook-Pro:kungs_shells kungs$ let a=a+1
NgandeMacBook-Pro:kungs_shells kungs$ echo $a
7
NgandeMacBook-Pro:kungs_shells kungs$ a=$((a+7))
NgandeMacBook-Pro:kungs_shells kungs$ echo $a
14

3.2 Linux常見符號

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

3.2.1 重定向符號( >>>)

shell指令碼中有兩種常見的重定向符號 >>>

1. >

作用:將符號左側的內容,以**覆蓋**的方式輸入到右側檔案中

例項:

NgandeMacBook-Pro:kungs_shells kungs$ echo 'nihao'
nihao
NgandeMacBook-Pro:kungs_shells kungs$ echo 'nihao' > nihao.txt
NgandeMacBook-Pro:kungs_shells kungs$ cat nihao.txt 
nihao
NgandeMacBook-Pro:kungs_shells kungs$ echo 'nihaoma' > nihao.txt
NgandeMacBook-Pro:kungs_shells kungs$ cat nihao.txt 
nihaoma

2. >>

作用:將符號左側的內容,以**追加**的方式輸入到右側檔案的末尾行中

例項:

NgandeMacBook-Pro:kungs_shells kungs$ cat nihao.txt 
nihaoma
NgandeMacBook-Pro:kungs_shells kungs$ echo 'hellonihao' >> nihao.txt
NgandeMacBook-Pro:kungs_shells kungs$ cat nihao.txt 
nihaoma
hellonihao
NgandeMacBook-Pro:kungs_shells kungs$ echo 'hellonihao1' >> nihao.txt
NgandeMacBook-Pro:kungs_shells kungs$ cat nihao.txt 
nihaoma
hellonihao
hellonihao1

3.2.2 管道符(|)

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

使用格式:命令1 | 命令2

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

例項:

NgandeMacBook-Pro:kungs_shells kungs$ env |grep SHELL
SHELL=/bin/bash

3.2.3 其他符號(&)

1. 後臺展示符號 &

定義:& 就是將一個命令從前臺轉到後臺執行

使用格式:命令 &

NgandeMacBook-Pro:kungs_shells kungs$ sleep 10 &
[1] 2483
NgandeMacBook-Pro:kungs_shells kungs$ 
NgandeMacBook-Pro:kungs_shells kungs$ 
NgandeMacBook-Pro:kungs_shells kungs$ 
NgandeMacBook-Pro:kungs_shells kungs$ 
[1]+  Done                    sleep 10
NgandeMacBook-Pro:kungs_shells kungs$ sleep 10 &
[1] 2489
NgandeMacBook-Pro:kungs_shells kungs$ ps aux |grep sleep
kungs             2493   0.0  0.0  2432804    772 s000  S+    3:58下午   0:00.00 grep sleep
kungs             2489   0.0  0.0  2432788    636 s000  S     3:58下午   0:00.00 sleep 10

2. 全部資訊符號 2>&1

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

符號例項

1).標準正確輸出例項:

NgandeMacBook-Pro:kungs_shells kungs$ cat nihao.txt 1>> zhengque
NgandeMacBook-Pro:kungs_shells kungs$ cat zhengque
nihaoma
hellonihao
hellonihao1

2).標準錯誤輸出例項:

NgandeMacBook-Pro:kungs_shells kungs$ lll
-bash: lll: command not found
NgandeMacBook-Pro:kungs_shells kungs$ dgsa
-bash: dgsa: command not found
NgandeMacBook-Pro:kungs_shells kungs$ dgsa 2>> cuowu
NgandeMacBook-Pro:kungs_shells kungs$ cat cuowu 
-bash: dgsa: command not found

綜合演示例項:

NgandeMacBook-Pro:kungs_shells kungs$ cat ceshi.sh 
#!/bin/bash
echo "下一條錯誤命令"
sahdaosfdofgaovavav
NgandeMacBook-Pro:kungs_shells kungs$ bash ceshi.sh 
下一條錯誤命令
ceshi.sh: line 3: sahdaosfdofgaovavav: command not found
NgandeMacBook-Pro:kungs_shells kungs$ bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err
NgandeMacBook-Pro:kungs_shells kungs$ cat ceshi-ok 
下一條錯誤命令
NgandeMacBook-Pro:kungs_shells kungs$ cat ceshi-err 
ceshi.sh: line 3: sahdaosfdofgaovavav: command not found
NgandeMacBook-Pro:kungs_shells kungs$ bash ceshi.sh 1>> ceshi-11 2>> ceshi-11
NgandeMacBook-Pro:kungs_shells kungs$ cat ceshi-11 
下一條錯誤命令
ceshi.sh: line 3: sahdaosfdofgaovavav: command not found
NgandeMacBook-Pro:kungs_shells kungs$ bash ceshi.sh >> ceshi-all 2>&1
NgandeMacBook-Pro:kungs_shells kungs$ cat ceshi-all 
下一條錯誤命令
ceshi.sh: line 3: sahdaosfdofgaovavav: command not found

3. linux 系統垃圾桶

/dev/null是linux下的一個裝置檔案,這個檔案類似於一個垃圾桶,特點是:容量無限大,常常把其設定到此垃圾桶裡,避免後期再去刪除相關檔案。

NgandeMacBook-Pro:kungs_shells kungs$ ls /dev/null
/dev/null
NgandeMacBook-Pro:kungs_shells kungs$ bash ceshi.sh >> /dev/null 2>&1

3.3 常見命令詳解(grepsedawkfind)

shell指令碼中經常使用的linux命令:grepsedawkfind

3.3.1 grep命令詳解

grep命令是常用的一個強大的文字搜尋命令。

格式:

grep [引數][關鍵字] <檔名>

注意:

我們在檢視某個檔案的內容的時候,是需要有<檔名>

grep命令在結合|(管道符)使用的情況下,後面的<檔名>是沒有的

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

引數詳解

    -c:只輸出匹配行的計數。
    -n:顯示匹配行及行號。
    -v:顯示不包含匹配文字的所有行。
NgandeMacBook-Pro:kungs_shells kungs$ cat grep.txt 
hello aaa
hello aaa
hello AAA
hello bbb
hello ccc
NgandeMacBook-Pro:kungs_shells kungs$ grep -c aaa grep.txt
2
NgandeMacBook-Pro:kungs_shells kungs$ grep aaa grep.txt 
hello aaa
hello aaa
NgandeMacBook-Pro:kungs_shells kungs$ grep -c hello grep.txt
5
NgandeMacBook-Pro:kungs_shells kungs$ grep -n aaa grep.txt 
1:hello aaa
2:hello aaa
NgandeMacBook-Pro:kungs_shells kungs$ grep -n ccc grep.txt 
5:hello ccc
NgandeMacBook-Pro:kungs_shells kungs$ grep -v aaa grep.txt 
hello AAA
hello bbb
hello ccc
NgandeMacBook-Pro:kungs_shells kungs$ grep -nr aaa *
grep.txt:1:hello aaa
grep.txt:2:hello aaa

3.3.2 sed命令詳解

sed 行檔案編輯工具。因為它編輯檔案是以行為單位的。

格式

sed [引數] '<匹配條件> [動作]'[檔名]
mac版:
sed [引數] '' '<匹配條件> [動作]'[檔名]

注意:可以通過 sed —help 檢視grep的幫助資訊

引數詳解:

1. 引數為空 表示sed的操作效果,實際上不對檔案進行編輯
2. -i   表示對檔案進行編輯
3. 注意:mac版的bash中使用 -i引數,必須在後單獨加個東西(''): -i ''

**匹配條件:**數字行號 或 關鍵字匹配

關鍵字匹配格式:'/關鍵字/'

注意:隔離符號/ 可以更換成 @#等符號

根據情況使用,如果關鍵字和隔離符號有衝突,就更換成其他的符號即可。

例:

[email protected]:/home/kungs# cat sed.txt 
insert_1
hello SED SED SED
news_add
hello sed sed sed
hello SED SED SED
[email protected]:/home/kungs# sed -i '2s\SED\sed\2' sed.txt 
[email protected]:/home/kungs# cat sed.txt 
insert_1
hello SED sed SED
news_add
hello sed sed sed
hello SED SED SED
[email protected]:/home/kungs# sed -i '[email protected]@[email protected]' sed.txt 
[email protected]:/home/kungs# cat sed.txt 
insert_1
hello SED sed sed
news_add
hello sed sed sed
hello SED SED SED
[email protected]:/home/kungs# sed -i '[email protected]@[email protected]' sed.txt 
[email protected]:/home/kungs# cat sed.txt 
insert_1
hello SED sed sed
news_add
hello sed sed sed
hello SED sed SED

動作詳解

-a      在匹配到的內容下一行增加內容
-i      在匹配到的內容上一行增加內容
-d      刪除匹配到的內容
-s      替換匹配到的內容

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

1. 替換命令(行號、列號、全體)

格式:sed -i [替換格式][檔名]

sed -i '行號s#原內容#替換內容#原內容第幾個(預設空:1,全部:g)' 檔名 
例:
sed -i '3s#SED#sed#g' sed.txt # 第三行所有的SED改為sed

例項:

NgandeMacBook-Pro:kungs_shells kungs$ cat sed.txt 
hello sed sed sed
hello sed sed sed
hello sed sed sed
hello sed sed sed

# 檔案第一行的第一個(預設) 'sed' 替換為 'SED'
NgandeMacBook-Pro:kungs_shells kungs$ sed -i '1s#sed#SED#' sed.txt 
NgandeMacBook-Pro:kungs_shells kungs$ cat sed.txt 
hello SED sed sed
hello sed sed sed
hello sed sed sed
hello sed sed sed

# 檔案所有行的第二個'sed'替換為'SED'
NgandeMacBook-Pro:kungs_shells kungs$ sed -i 's#sed#SED#2' sed.txt 
NgandeMacBook-Pro:kungs_shells kungs$ cat sed.txt 
hello SED sed SED
hello sed SED sed
hello sed SED sed
hello sed SED sed

# 檔案第三行的第二個'sed'替換為'SED'
NgandeMacBook-Pro:kungs_shells kungs$ sed -i '3s#sed#SED#2' sed.txt 
NgandeMacBook-Pro:kungs_shells kungs$ cat sed.txt 
hello SED sed SED
hello sed SED sed
hello sed SED SED
hello sed SED sed

# 檔案所有行的所有'sed'替換為'SED'
NgandeMacBook-Pro:kungs_shells kungs$ sed -i 's#sed#SED#g' sed.txt 
NgandeMacBook-Pro:kungs_shells kungs$ cat sed.txt 
hello SED SED SED
hello SED SED SED
hello SED SED SED
hello SED SED SED

# 檔案第三行所有的'SED'替換為'sed'
NgandeMacBook-Pro:kungs_shells kungs$ sed -i '3s#SED#sed#g' sed.txt 
NgandeMacBook-Pro:kungs_shells kungs$ cat sed.txt 
hello SED SED SED
hello SED SED SED
hello sed sed sed
hello SED SED SED

2. 增加操作

**目的1:**在指定行號的下一行增加內容;

**目的2:**在指定行號的上一行增加內容;

格式:

# 在某行號的下一行增加內容
sed -i '行號a\增加的內容' 檔名
# 增加多行,可以在行號位置寫個範圍值,彼此間用逗號隔開,例:在1~3每行的下一行都增加內容
sed -i '1,3a\增加內容' 檔名

# 在指定行號的前一行增加內容
sed -i '行號i\增加的內容' 檔名
# 行號前增加多行,可以在行號位置寫個範圍值,彼此間使用逗號隔開,例:在1~3每行的上一行都增加內容
sed -i '1,3i\增加內容' 檔名


注意:在mac終端中有所區別,不然會報下面的錯
NgandeMacBook-Pro:kungs_shells kungs$ sed -i '' '1a\add-1\' sed.txt 
sed: 1: "1a\add-1\": extra characters after \ at the end of a command
NgandeMacBook-Pro:kungs_shells kungs$ sed -i '' "1,3a\tongshi-2" sed.txt
sed: 1: "1,3a\tongshi-2": command a expects up to 1 address(es), found 2

正確做法:下面是mac中的正確方法
# 在某行號的下一行增加內容
NgandeMacBook-Pro:kungs_shells kungs$ sed -i '' "1a\\
> 增加的內容\\
> " 檔名
注意:這裡增加多行目前沒有辦法去解決

例項:

[email protected]:/home/kungs# cat sed.txt 
hello SED SED SED
hello SED SED SED
hello sed sed sed
hello SED SED SED
[email protected]:/home/kungs# sed -i '1a\add_news' sed.txt 
[email protected]:/home/kungs# cat sed.txt 
hello SED SED SED
add_news
hello SED SED SED
hello sed sed sed
hello SED SED SED
[email protected]:/home/kungs# sed -i '1,3a\news_add' sed.txt 
[email protected]:/home/kungs# cat sed.txt 
hello SED SED SED
news_add
add_news
news_add
hello SED SED SED
news_add
hello sed sed sed
hello SED SED SED

[email protected]:/home/kungs# sed -i '1i\insert_1' sed.txt 
[email protected]:/home/kungs# cat sed.txt 
insert_1
hello SED SED SED
news_add
add_news
news_add
hello SED SED SED
news_add
hello sed sed sed
hello SED SED SED
[email protected]:/home/kungs# sed -i '1,3i\insert_news' sed.txt 
[email protected]:/home/kungs# cat sed.txt 
insert_news
insert_1
insert_news
hello SED SED SED
insert_news
news_add
add_news
news_add
hello SED SED SED
news_add
hello sed sed sed
hello SED SED SED

3. 刪除操作

格式:

# 指定行號刪除
sed -i '行號d' 檔名
# 如果刪除多行,可以在行號位置多寫幾個行號,彼此間使用逗號隔開,例:1-3行刪除
sed -i '1,3d' 檔名

例項:

[email protected]:/home/kungs# cat sed.txt 
insert_news
insert_1
insert_news
hello SED SED SED
insert_news
news_add
add_news
news_add
hello SED SED SED
news_add
hello sed sed sed
hello SED SED SED
[email protected]:/home/kungs# sed -i '1d' sed.txt 
[email protected]:/home/kungs# cat sed.txt 
insert_1
insert_news
hello SED SED SED
insert_news
news_add
add_news
news_add
hello SED SED SED
news_add
hello sed sed sed
hello SED SED SED
[email protected]:/home/kungs# sed -i '2,7d' sed.txt 
[email protected]:/home/kungs# cat sed.txt 
insert_1
hello SED SED SED
news_add
hello sed sed sed
hello SED SED SED

3.3.3 awk命令詳解

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

命令格式:

awk [引數] '[ 動作]' [檔名]

常見引數:-F 指定行的分隔符

常見動作:

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

常見內建變數

FILENAME   當前輸入檔案的檔名,該變數是隻讀的
NR         指定顯示行的行號
NF         輸出最後一列的內容
OFS        輸出格式的列分隔符,預設是空格
FS         輸入檔案的列分融符,預設是連續的空格和Tab

例項:

[email protected]:/home/kungs# cat awk.txt 
hello awk awk awk awk
hello awk awk awk awk
[email protected]:/home/kungs# awk '{print $0}' awk.txt 
hello awk awk awk awk
hello awk awk awk awk
[email protected]:/home/kungs# awk '{print $1}' awk.txt 
hello
hello
[email protected]:/home/kungs# awk '{print $1$3}' awk.txt 
helloawk
helloawk
[email protected]:/home/kungs# awk '{print $1,$3}' awk.txt 
hello awk
hello awk

# 列印第1列第3列內容,顯示行的行號
[email protected]:/home/kungs# awk '{print NR,$1,$3}' awk.tx