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