1. 程式人生 > 實用技巧 >BASH知識點記錄

BASH知識點記錄

bash配置檔案

profile類

為互動式shell提供配置檔案

~/.bash_profile 個人配置

/etc/profile,/etc/profile.d/*.sh 全域性配置

功用:定義環境變數;執行命令和指令碼。

bashrc類

為非互動式使用者提供配置檔案

~/.bashrc 個人配置

/etc/bashrc 全域性配置

功用:定義本地變數,別名。

登入式shell讀取配置檔案順序

/etc/profile ---> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非登入式shell讀取順序

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

讓定義的配置檔案立即生效

#source /etc/profile

#. /etc/bashrc

bash的工作特點

命令執行狀態返回值

每個命令執行結束後,會有“執行狀態返回值”,有效範圍:0-255

0:表示執行成功

1-255:表示執行失敗

使用$? 可檢視狀態返回值

命令

格式:

COMMAND OPTIONS ARGUMENTS # 命令 選項 引數

使用type檢視命令型別

內部命令:shell程式自帶的命令,由shell內建提供

外部命令:獨立的可執行程式檔案,名字即為程式名

執行外部命令時查詢方式

echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

選項

短格式選項-char

-l, -d, -h,

-ldh

長格式選項

--word, --long, --directory, ...

引數

命令的作用物件

快捷鍵

Ctrl+a:游標跳至命令列首

Ctrl+e:游標跳至命令列尾

Ctrl+u:刪除游標之前的所有內容

Ctrl+k:刪除游標之後的所有內容

bash功能

檔名通配:globbing

特殊字元,元字元

不表示字元的表面意義,而是被匹配符合指定特徵的字串

*:匹配任意長度的字元,包括空

?:匹配任意單個字元,不包括空

[]:匹配指定範圍[]內的任意單個字元

[^]取反,匹配指定範圍[]之外的任意單個字元

字元集合

[:space:]表示所有空白字元

[[:space:]]表示匹配其中任意一個

[:punct:]所有的標點符號

[:lower:]所有小寫字母a-z

[:upper:]所有大寫字母A-Z

[:digit:]所有的數字 1-9

[:alnum:]所有的數字和字母字元

[:alpha:]所有的字母

命令補全,路徑補全

history

history

-c清空歷史記錄

-w儲存快取中的歷史命令到歷史檔案中

-a追加儲存

-d n刪除第n條歷史記錄

export HISTCONTROL=ignorespace\執行history命令時,不顯示空格開頭的命令

export HISTCONTROL=ignoredups\忽略重複的命令

export HISTCONTROL=ignoreboth\空格開頭的重複的命令全不顯示

位置:通常在使用者家目錄下.bash_history

!#:執行第幾條歷史命令

!!:執行上一條命令

!..:執行上一個..開頭的命令

!$:呼叫上一條命令的最後一個引數

按ESC鬆開再按.號,即會重新呼叫上一個命令的引數

管道和重定向

輸出重定向:

COMMAND > POSITION 覆蓋輸出

COMMAND > POSITION 在原有內容的後面追加輸出

錯誤重定向:

COMMAND 2> POSITION 只有錯誤資訊才會被重定向

COMMAND 2>> POSITION

合併重定向:

COMMAND &> POSITION 無論正確與否全部重定向

COMMAND > POSITION 2> POSITION

輸入重定向:

COMMAND < POSITION 覆蓋輸入,是指把POSITION的內容定向給COMMAND,並顯示COMMAND的執行結果

COMMAND << POSITION 追加輸入,此處文件

常搭配EOF使用:

#cat > /tmp/123.txt << EOF

>Hello,world.

>How are you?

>EOF

單雙引號區別

“”:雙引號,弱引用,裡面的變數會被替換

‘’:單引號,強引用,裡面的所有字元都是字面量,直接輸出

如果一個字串沒有變數,單雙引號沒有區別

如果有變數,想要獲取變數的結果,需要雙引號,如果想要變數本身,那麼使用單引號

如果是命令,需要使用反引號,才能得到該命令執行的結果

bash變數

記憶體空間地址+資料,資料是放在記憶體中,即也叫有名稱的記憶體地址

變數的賦值:向變數的儲存空間中儲存資料

定義一個變數後,也就確定了:

1,儲存機制,如儲存的是字元型還是數值型等;

2,儲存空間

3,參與的運算方式,如數值型的加減乘除等;

bash對變數的機制:

1,所有都看作字元型

2,不支援浮點資料,需借用外部機制

3,變數無需事先宣告,相當於,賦值和宣告同時實現

命名規範:

1,不能以數字開頭,只能使用字母,數字和下劃線

2,變數名要做到見名知義,如userName=admin風格

3,不能使用程式中的關鍵字(保留字),如if,else,where,for等

檢視變數:

檢視當前shell程序中所有的本地變數

set

檢視當前shell程序中的所有環境變數

export

printenv

env

取消賦值:unset VAR_NAME(注意,這裡不需要加$)

本地變數:作用範圍僅當前shell,對其他shell和當前shell的子程序都無效,重啟後失效;

賦值:var_name=VALUE

環境變數:只作用於當前shell程序及其子程序

使用者可自定義環境變數:

bash有許多內建的環境變數,賦值時注意不要重名

export VAR_NAME=VALUE # 定義一個環境變數

export VAR_NAME # 匯出一個變數為環境變數

readonly VAR_NAME # 鎖定變數為只讀變數,在當前shell程序結束前無法更改

var_name=value --> export var_name

declare -x var_name=VALUE # -x 表示定義為一個環境變數

如:declare -i var_name=VALUE # 將var_name定義為整形

區域性變數:作用範圍為shell指令碼中的某片程式碼片,通常用於函式本地

local VAR_NAME=VALUE

位置變數

使用$1, $2, ..., $9, ${10}, ...

$0表示指令碼檔案路徑本身;取檔名:basename $0

shift:把引用過的引數'踢'掉,在指令碼中永遠只使用$1引用下一個

例如:shift 2 :踢2個,這樣就可以在指令碼中永遠以$1和$2來引用後面的引數

特殊變數:shell內建,有特殊功用

$? 上個命令的狀態返回值

$# 傳遞給指令碼引數的個數,就是一共有多少個位置變數

\(* 或\)@ 引用傳遞給指令碼的所有引數

變數引用:

1,${var_name}

2,$var_name

3,date 反引號``,有同樣效果

一般\(var與\){var}並沒有啥不一樣

但是用${}會比較精確的界定變數名稱的範圍,比如:

$A=B

$echo $AB

原意是想將$A的值替換出來,然後在後面加B,但在命令列上,結果卻是隻會替換變數為AB的值出來

正確的應該是${A}B

變數撤銷

unset var_name

bash弱型別:

變數=值 (無需事先宣告,可直接使用,預設值為字元型)

變數的值的型別:

數值型:

精確數值:整數

近似數值:浮點型,浮點型又分單精度和雙精度浮點型

字元型:char,string

布林型:true,false

增強型賦值:

a=\([\)a+100],一般寫成 let a+=100

表示變數a在自己的值上加上一個100,得到的結果在賦值給本身

+=, -=, *=, /=, %=, **= 都需要使用let命令進行描述

變數自加:var=\([\)var+1] == let var+=1 == let var++

表示一個變數每次只加1或減1,賦值給自己本身,可寫成此形式

export PATH=$PATH:

unset PATH //撤銷變數

算術運算:bash會對數字執行隱式的型別轉換

let VAR_NAME=Integer_Value(語句)

declare -i Var_Name=Integer_Value

VAR_NAME=$Integer_Value(表示式)

操作符:+, -, *, /, %(取模), **(次方)

雙目運算子:需要至少兩個運算元

bash的算術運算的方式:

let Var_Name=EXPRESSION(表示式)

$[EXPRESSION]

$((EXPRESSION))

命令:expr ARG1 OP ARG2

舉例:

#let sum=\(num1+\)num2

#echo $sum

#echo $[ $num1 + $num2 ]

#echo \(((\)num1 + $num2))

expr $num1 + $num2

語句不能單獨執行,需要let等命令來執行

表示式可以單獨執行

給變數以預設值

varName=${varName-:value}

若varName不為空,則其值不變;否則,會使用value作為其值

邏輯運算

布林運算:真1和假0

與運算:

1 && 1 = 1

1 && 0 = 0

0 && 1 = 0

0 && 0 = 0

只有兩個都為真,結果才為真,否則為假。遵守短路法則

或運算:

1 || 0 = 1

1 || 1 = 1

0 || 1 = 1

0 || 0 = 0

只要有一個為真,即為真,類似電路並聯

非運算:

非真為假,非假為真

異或運算:

判斷兩者是否不同,不同者為真;相同者為假

短路法則:

COMMAND1 && COMMAND2

COMMAND1為真,COMMAND2才會執行;COMMAND1為假時,COMMAND2不會在執行。

COMMAND1 || COMMAND2

COMMAND1為真,COMMAND2不執行;COMMAND1為假,COMMAND2才會執行

bash條件測試

命令執行成功與否,即為測試條件

命令執行成功與否為測試條件

test 表示式

[ 表示式 ]

[[ 表示式 ]]

比較運算:

<, >, <=, >=, ==, !=,

整型比較:數值間的大小比較

-eq:等於

-gt:大於

-lt:小於

-ge:大於等於

-le:小於等於

-ne:不等於

a=10
b=20
[ $a -gt $b ]
echo $?

字串比較:

字串大小比較

1,字串要加引號引用

2,作比較時使用雙中括號[[ VAR ]]

==:等於

>:大於 需用雙中括號

<:小於 [[ ]]

!=:不等於

=~:左側的字串是否能被右側的pattern所匹配,匹配為一部分,不是精確匹配,如:[[ "ab" =~ [ab][Ab][AB] ]]

例如:寫個指令碼,可判斷輸入的使用者是否有可登入shell

#!/bin/bash
#
read -p "Plz input a username: " userName
userInfo=`grep "^$userName\>" /etc/passwd

if [[ "$userName" =~ /bin/.*sh$ ]]; then
     echo "Can login."
else
     echo "Not can login."
fi`

-z “STRING”:判斷指定的字串是否為空,空則為真,不空則假

-n “string”:判斷指定的字串是否不空,空則為假,不空則真

#[ "$a" -gt "$b" ]
#echo $?

判斷檔案的存在性及屬性等

-a或-e FILE:判斷一個檔案是否存在,存在即為真;

-f FILE :存在且為普通檔案,則為真;

-d FILE:存在且為目錄,則為真;

-L或-h FILE :存在且為軟連結檔案,則為真;

-b FILE:塊裝置

-S FILE:套接字檔案

-s FILE :存在且為非空檔案

-N FILE:修改時間新於訪問時間的檔案,如被重定向過的檔案

-r FILE:存在且可讀

-w:可寫

-x:可執行

例如:

FILE1 -nt FILE2:檔案1的修改時間mtime,新於檔案2,則為真;

FILE1 -ot FILE2 :舊於

FILE1 -ef FILE2 :

例如:

if [ -x $a ];then
    echo $a
fi

許可權測試

r,w,x,

組合條件測試:

與:[ condition1 -a condition2 ]

或:[ condition1 -o condition2 ]

非:[ -not condition ]

bash切片

1、基於字串切片

Usage: ${var:offset: length}

# 定義一個變數,等會切這個變數
mypath="/etc/sysconfig/network-scripts/"
echo ${mypath:5} #偏移5個字元顯示
"""
sysconfig/network-scripts/
"""

echo ${mypath:10} #偏移10個字元顯示
"""
nfig/network-scripts/
"""

echo ${mypath:5:5} #偏移5個字元,取5個字元 
"""
sysco    
"""

# 取出字串的最後幾個字元:${var: -length}
# 注意:-length之前有空白字元
echo ${mypath: -10}
"""
k-scripts/
"""

2、基於模式取子串

Usage:
${var#*word}: 自左而右,查詢var變數中儲存的字串中第一次出現的由word所指明的字元,刪除此字元及其左側的所有內容

${var##*word}: 自左而右,查詢var變數中儲存的字串中最後一次出現的由word所指明的字元,刪除此字元及其左側的所有內容

${var%word*}: 自右而左,查詢var變數中儲存的字串中第一次出現的由word所指明的字元,刪除字元及其右側的所有內容

${var%%word*}: 自右而左,查詢var變數中儲存的字串中最後一次出現的由word所指明的字元,刪除此字元及其右側的所有內容

mypath="/etc/sysconfig/network-scripts"
echo ${mypath#*/}
"""
etc/sysconfig/network-scripts
"""

mypath="/etc/sysconfig/network-scripts"
echo ${mypath##*/}
"""
network-scripts
"""

mypath="/etc/sysconfig/network-scripts"
echo ${mypath%c*}
"""
/etc/sysconfig/network-s
"""

echo ${mypath%%c*}
"""
/et
"""

3、基於字串查詢替換

Usage:
${var/pattern/replacement} :查詢var變數儲存的字元中第一次由pattern匹配到的內容,並替換為replacement

${var//pattern/replacement} :查詢var變數儲存的字元中所有能夠由pattern匹配到的內容,並替換為replacement

${var/#pattern/replacement} :查詢var變數儲存的字元中最開始處能夠由pattern匹配到的內容,並替換為replacement

${var/%pattern/replacement} : 查詢var變數儲存的字元中最後位置能夠由pattern匹配到的內容,並替換為replacement

示例:

url="http://www.baidu.com:80"
echo ${url/www/WWW}
"""
http://WWW.baidu.com:80
"""

echo ${url/w/W}
"""
http://Www.baidu.com:80
"""

echo ${url//w/W}
"""
http://WWW.baidu.com:80
"""

userinfo="root:x:0:0:rootuser:/root:/bin/bash"
echo ${userinfo/#root/ROOT}
"""
ROOT:x:0:0:root user:/root:/bin/bash
"""

userinfo="root:x:0:0:rootuser:/root:/bin/root"
echo ${userinfo/%root/ROOT}
"""
root:x:0:0:root user:/root:/bin/ROOT
"""

4、基於字串查詢刪除
Usage:
\({var/pattern}:刪除變數第一次pattern匹配到的內容 \){var//pattern}:刪除變數所有pattern匹配到的內容
\({var/#pattern}:刪除變數頭部匹配pattern的內容 \){var/%pattern}:刪除變數尾部能夠匹配pattern的內容
示例:

userinfo="root:x:0:0:rootuser:/root:/bin/root"
echo ${userinfo/root}
"""
:x:0:0:root user:/root:/bin/root
"""

echo ${userinfo//root}
"""
:x:0:0: user:/:/bin/
"""

echo ${userinfo/#root}
"""
:x:0:0:root user:/root:/bin/root
"""

echo ${userinfo/%root}
"""
root:x:0:0:root user:/root:/bin/
"""

5、基於字串大小寫轉換
Usage:
\({var^^}:把var變數中的所有小寫字母,統統替換為大寫; \){var,,}:把var變數中的所有大寫字母,統統替換為小寫;
示例

echo $userinfo
"""
root:x:0:0:root user:/root:/bin/root
"""

myinfo=${userinfo^^}
echo $myinfo
"""
ROOT:X:0:0:ROOT USER:/ROOT:/BIN/ROOT
"""

echo ${myinfo,,}
"""
root:x:0:0:root user:/root:/bin/root
"""

6、空變數判斷賦值
Usage:
${var:-word}:如果變數var為空或未宣告,則返回word所表示的字串;否則,則返回var變數的值, 臨時賦值

echo $name # 這行的值為空
echo ${name:-tom}
tom

name=hello 
echo ${name:-tom}            hello

${var:=word}:如果變數var為空或未宣告,則返回word所表示的字串,並且把word賦值為var變數;否則,則返回var變數的值,直接等值

echo "User's name is${name:?wrong}"
-bash: name: wrong

name=tom
echo "User's name is${name:?wrong}"
User's name is tom

${var:+word}:如果變數var為空或未宣告則忽略;否則,則返回word;

unset name
echo "User's name is ${name:+wrong}"
"""
User's name is
"""

name=tom
echo "User's name is${name:+wrong}"
"""
User's name is wrong 
"""

正則表示式字元匹配

.:匹配任意單個字元

.*:匹配任意字元,0個到無窮多個

[]:匹配指定範圍內的任意字元:

[0-9],[[:digit:]]

[a-z],[[:lower:]]

[A-Z],[[:upper:]]

空白 [[:space:]]

所有標點符號 [[:punct:]]

所有大小寫字母 [[:alpha:]]

所有大小寫字母和數字符號 [[:alnum:]]

[^] 取反

bash環境中特殊符號

#:批註符號,視為說明

\:轉義符號,將特殊字元或萬用字元還原成一般字元

|:管道。左邊命令結果,輸送給右邊命令執行

;:連續命令執行分隔符,前面命令執行完,執行後面一個,然後同時輸出螢幕

&&:如果前面的命令執行正確,則開始執行後面的命令,如果前面命令出錯,後面命令也不會執行

||:如果前面的命令執行成功,則後面的命令不執行,反之,如果前面的命令執行失敗,則開始執行後面的命令

$:使用變數前導符

&:作業控制,將命令送到後臺執行

!:邏輯運算中‘非’的意思

‘’:單引號,不具有變數置換功能,原樣輸出

“”:雙引號,具有變數置換的功能

··:反單引號,優先執行的命令,等同於$()

RAID

:0:條帶技術 效能+,讀寫+
冗餘 -
1:映象 (每塊硬碟都儲存同一種資料) 效能+,讀+,寫-
冗餘+
2:3:4:校驗碼技術5:RAID 5 (至少3塊) 效能+,讀寫+
冗餘+1+0: (至少4塊) 效能+,讀寫+
冗餘+
0+1:(至少4塊) 效能+,讀寫+ 冗餘+5+0: (至少6塊) 效能+,讀寫+
冗餘+JBOD技術:適用於儲存單個大檔案,多個硬碟累加當成一塊硬碟用 效能0,讀寫0
冗餘0(至少2塊)(ps:比如一塊硬碟儲存一個檔案,這個檔案的大小累計增長的,當檔案大小達到硬碟容量後,這時可以在新增一塊硬碟,然後使用JBOD技術,把新加的硬碟與原硬碟合併成一整塊硬碟。)

![img](file:///D:/My Knowledge/temp/6ea688a4-c878-4750-b831-eda777da87d0/128/index_files/9b88cf85-3efc-465c-a7f3-390a86c4e9b9.png)
![img](file:///D:/My Knowledge/temp/6ea688a4-c878-4750-b831-eda777da87d0/128/index_files/4dd05eca-0141-4c9f-b8de-d67d044d3045.jpg)

man手冊的段落

NAME:命令的名稱
DESCRIPTION:命令功能的詳細描述
OPTIONS:所有選項
SYNOPSIS:使用格式
EXAMPLES:使用示例
FILES:與當前命令相關的配置檔案
SEE ALSO:可參考的其他手冊
幫助中的格式字串 []:可省略
<>:不可省略
| : 二選一或多選一
... : 同類內容可以出現多個

Linux將命令列執行的命令記錄到日誌檔案中便於審計使用

配置方法:

1,編輯/etc/bashrc檔案

vim /etc/bashrc

# 在此檔案的最後一行加入如下內容

export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[hostname- \((hostname)]": "[euid=\)(whoami)]":\((who am i):[`pwd`]:"\)msg"; }'

# 儲存退出

2,重新載入下bashrc

source /etc/bashrc

3,檢視配置結果

# 在執行如下之令之前,可以隨意執行幾個命令,以便顯示效果

tail -f /var/log/messages

end