天天看點

Linux shell腳本需要用到的字元指令整理:

1、&、&&、||、2>&1、&>、>&2

&:可以把現在工作的任務切換到背景;

&&:邏輯與;

||:邏輯或;

标準輸入:代碼為0,使用<或<<

标準輸出:代碼為1,使用>或>>

标準錯誤輸入:代碼為2,使用2>或2>>

2>&1:把标準錯誤2像1一樣輸出;

&>:全部輸出;

>&2:傳送輸出到标準錯誤

1>:正常輸出

2、< > >> <<<

<:從檔案導入

>:導入到檔案

>>:追加導入

<<<:指令調用導入

标準輸入:利用标準輸入和鍵盤輸入eof組合

cat > catfile << "eof"

d

d

eof <===輸入此關鍵字,立刻就結束而不需要輸入ctrl+d

3、subshell與代碼塊

結構 定界符 認可的位置
subshell () 行上的任何位置
代碼塊 {} 再換行字元、分号或關鍵字之後

4、變量的設定規則:

①變量與變量内容以一個等号"="來連接配接;

②等号兩邊不能直接接空格符;

③變量名稱隻能是英文字母與數字,但是開頭字元不能是數字;

④變量内容若有空格符可使用雙引号""或單引号''将變量内容結合起來,但是雙引号内的特殊字元如$等,可以保有原本的特性;

單引号内的特殊字元則僅為一般字元(純文字);将特殊符号(如[enter]、$、\、空格符、!等)變成一般字元;

⑥在一串指令中,還需要通過其他的指令提供的資訊,可以使用反單引号"

指令

"或"$(指令)"。特别注意,反單引号是數字鍵1左邊的按鍵,不是單引号!

⑦若該變量為了增加變量内容時,則可用"$變量名稱"或${變量}累加内容;

⑧若變量需要在其他子程序執行,則需要以export來使變量變成環境變量:“export PATH”

⑨通常大寫字元為系統預設變量,自行設定變量可以使用小寫字元,友善判斷。

⑩取消變量的方法為使用“unset變量名稱”。

5、變量的應用方式:

${file:0:5} 提取最左邊的 5 個位元組   
${file:5:5} 提取第 5 個位元組右邊的連續 5 個位元組
${file/dir/path} 将第一個 dir 提換為 path
${file//dir/path} 将全部 dir 提換為 path
${#file}   擷取變量長度
(())重定義變量值;
$(( ))與整數運算; 在 $(( )) 中的變量名稱,可于其前面加 $ 符号來替換,也可以不用。

$(( ))可以将其他進制轉成十進制數顯示出來;用法如下:

echo $((N#xx))

其中,N為進制,xx為該進制下某個數值,指令執行後可以得到該進制數轉成十進制後的值。

${ }變量替換

一般情況下,$var與${var}是沒有差別的,但是用${ }會比較精确的界定變量名稱的範圍。

$( )與`` 指令替換

6、數組變量

A="a b c def" # 定義字元串

A=(a b c def) # 定義字元數組

指令 解釋 結果
${A[@]} 傳回數組全部元素 a b c def
${A[*]} 同上 a b c def
${A[0]} 傳回數組第一個元素 a
${#A[@]} 傳回數組元素總個數 4
${#A[*]} 同上 4
${#A[3]} 傳回第四個元素的長度,即def的長度 3
A[3]=xzy 則是将第四個組數重新定義為 xyz
執行個體:
# aaa=(1 2 3)
# echo $aaa
1
# echo ${aaa[0]}
1
# echo $aaa[0]
1[0]
# echo $(aaa)
-bash: aaa: command not found
           

7、變量内容的删除:"#""%"

變量設定方式 說明
${變量#關鍵字} 若變量内容從頭開始的額資料符合"關鍵字",則将符合的最短資料删除
${變量##關鍵字} 若變量内容從頭開始的資料符合"關鍵字",則将符合的最長資料删除
${變量%關鍵字} 若變量内容從尾向前的資料符合"關鍵字",則将符合的最短資料删除
${變量%%關鍵字} 若變量内容從尾向前的資料符合"關鍵字",則将符合的最長資料删除

8、變量内容的替換:"變量/old /new"

變量設定方式 說明
${變量/舊字元串/新字元串} 若變量内容符合"舊字元串",則将第一個舊字元串會被新字元串替換
${變量//舊字元串/新字元串} 若變量内容符合"舊字元串",則全部的舊字元串會被新字元串替換

9、變量的測試與内容替換

在某些時候,我們需要經常“判斷”某個變量是否存在,若變量存在則使用既有的設定,若變量不存在則給予一個常用的設定。

變量設定方式 str沒有設定 str為空字元串 str已設定非為空字元串
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= var= var=expr
var=${str=expr} str=expr var=expr str不變 var= str不變 var=$str
var=${str:=expr} str=expr var=expr str=expr var=expr str不變 var=$str
var=${str?expr} expr輸出至stderr var= var=$str
var=${str:?expr} expr輸出至stderr expr輸出至stderr var=$str

10、通配符

基本通配符

通配符 比對
? 任何的單一字元
* 任何的字元字元串
[set] 任何在set裡的字元
[!set] 任何不在set裡的字元
符号 意義
* 代表0個到無窮多個任意字元
? 代表一定有一個任意字元
[] 同樣代表一定有一個在中括号内的字元(非任意字元)。
[-] 若有減号在中括号内時,代表在編碼順序内的所有字元。
[^] 若中括号内的第一個字元為指數符号(^),那表示反向選擇
# 批注符号,這個最常被使用在腳本當中
\ 轉義符号,将"特殊字元或通配符"還原成一般字元
| 管道,分隔兩個管道指令的界定
; 連續指令執行分隔符,連續性指令的界定(與管道指令并不相同)
~ 使用者的主檔案夾
$ 使用變量前導符,既是變量之前需要加的變量替代值
& 作業控制,将指令變成背景下工作
! 邏輯運算意義上的"非"的意思
/ 目錄符号,路徑分隔的符号
>,>> 資料流重定向,輸出導向,分别是"替換"與“累加”
<,<< 資料流重定向,輸入導向
'' 單引号,不具有變量置換的功能
"" 具有變量置換的功能
`` 兩個反引号中間為可以先執行的指令,也可使用$()
() 在中間為子shell的起始與結束
{} 在中間為指令塊的組合

使用set結構的通配符

表達式 比對的單一字元
[abc] a、b、c
[.,;] 句号、逗号,或分号
[-_] 破折号或下劃線
[a-c] a、b或c
[a-z] 任何一個小寫字母
[!0-9] 任何一個非數字字元
[0-9!] 任何一個數字或感歎号
[a-zA-Z] 任何一個小寫或大寫字母
[a-zA-Z0-9_-] 任何一個字母、任何一個數字、下劃線或破折号

11、通配符和正規表達式的差別

通配符和正規表達式不一樣!!!

通配符代表的是bash操接口的一個功能,

正規表達式則是一種字元串處理的表達方式。

12、正規表達式

12.1、基礎字元

RE字元 意義與範例
^word 待查找的字元串在行首
word$ 待查找的字元串在行尾
. 代表一定有一個任意字元的字元
\ 轉義字元,将特殊符号的特殊意義去除
* 重複零個到無窮多個的前一個字元
[list] 比對方括号内的任一字元
[n1-n2] 從字元集合的RE字元裡面找出想要選取的字元範圍
[^list] 從字元集合的RE字元裡面找出不要的字元串或範圍
\{n,m\} 連續n到m個的前一個RE字元,若為{n}則是連續N個的前一個RE字元,若為{n,}則是連續n個以上的前一個RE字元
\(\) 将()間的表達式存儲在特殊的“保留白間”。最多可以将9個獨立的子表達式存儲在單個模式中。比對于子表達式的文本,可通過轉義序列\1至\9,被重複使用在相同模式裡。
\n 重複在()方括号内子表達式 比對成功的字元
() \n 聯合使用被稱為後向引用

{start..end}

{1..255} 1到255的意思

12.2擴充字元

RE字元 意義與範例
+ 比對前面正規表達式的一個或多個執行個體
? 比對前面正規表達式零個或一個執行個體
| 比對于
() 比對于方括号括起來的正規表達式群
()+ 對個重複組的判别
{n,m} 與BRE中的{n,m}一樣

12.3特殊字元

特殊符号 代表意義
[:alnum:] 所有字母和數字,即0-9,A-Z,a-z
[:alpha:] 所有字母,即A-Z,a-z
[:blank:] 空格鍵與[tab]按鍵
[:cntrl:] 所有控制字元
[:digit:] 所有數字,即0-9
[:graph:] 所有可列印字元,不包括空格和[tab]按鍵
[:lower:] 所有小寫字母
[:print:] 所有可列印字元,包括空格和[tab]按鍵
[:punct:] 所有标點符号
[:space:] 所有水準或垂直空白
[:upper:] 所有大寫字母
[:xdigit:] 所有十六進制數字

\f 換頁

\n 換行

\r 回車

\s 空白字元:空格、制表符、換頁符

\S 非空白字元

\t 制表符

\d 一個數字字元0-9

\D 非數字字元

\w 比對字母數字下劃線,相當于[A-Za-z0-9_]

\W比對非字母數字下劃線。相當于[^A-Za-z0-9_]

\b 比對起始或結尾處所找到的空字元串

\B 比對兩個單詞組成字元之間的空字元串

< > 比對單詞的起始于結尾

' ` 分别比對emacs緩沖區的開始于結尾

13、特殊變量

$# $@ $$ $?
變量 意義
# 目前程序的參數個數
@ 傳遞給目前程序的指令行參數。置于雙引号内,會展開為個别的參數
* 目前程序的指令行參數,至于雙引号内,則展開為一單獨參數
- 在引用時給予shell的選項
前一指令的退出狀态
$ shell程序的程序編号
shell程式的名稱
最近一個背景指令的程序編号。以此方式存儲的程序編号,可通過wait指令使用

14、算數運算

運算符 意義 順序
++ -- 增加及減少,可前置也可放在結尾 由左至右
+ - ! ~ 一進制的正與負号;邏輯與位的取反 由右至左
* / % 乘法、除法,與餘數 由左至右
+ - 加法,減法 由左至右
<< >> 向左位移、向右位移 由左至右
< <= > >= 比較 由左至右
== != 相等于不等 由左至右
& 位的AND 由左至右
^ 位的Exclusive OR 由左至右
| 位的OR 由左至右
&& 邏輯的AND 由左至右
|| 邏輯的OR 由左至右
?: 條件的表達式 由右至左
= += -= *= /= %= &= ^= <<= >>= = 指派運算符

可利用圓括号将子表達式塊括起來。關系運算符産生數字結果中,1表示為真,0表示為假。

對邏輯的AND或OR運算符而言,任何的非0值函數都為真;

#i=5

#echo $((i++)) $i 運算符出現在變量之後,在結果産生後,将舊值傳回給變量,再執行變量加1的操作。

5 6

#echo $((++i)) $i 運算符放在變量的前面,先将變量加1,再傳回新值給變量。

7 7

15、自定義函數

在shell腳本中存在兩種格式的函數:
第一種:

采用關鍵字function,後跟配置設定給該代碼塊的函數名。

文法:

function name {

commands

}

name定義了賦予函數的唯一名稱。腳本中定義的每個函數都必須有一個唯一的名稱。

commands是構成函數的一條或多條bash shell指令。在調用該函數時,bash shell會按指令在函數中出現的順序依次執行。

第二種:

name () {

commands

}

函數名後的空括号表明正在定義的是一個函數。

在函數體中,位置參數($1、$2、....、$#、$*,以及$@)都是函數的參數,父腳本的參數則臨時地被函數參數所掩蓋或隐藏。$0依舊是父腳本的名稱 。當函數完成時,原來的指令行參數會恢複。

在shell函數裡,return語句會傳回一個退出值給調用者。

在shell函數體裡使用exit,會終止整個shell腳本!

16、使用while讀取檔案内容

while read line
do
command
done < filename
 
或
while read line
do
command
done <空格 <command(例如:find $path -type f -print)
 
<command(例如:find $path -type f -print)等同于檔案名。隻不過它用子程式輸出來代替檔案名。注意,第一個<用于輸入重定向,第二個<用于将子程式的輸出裝換成檔案名。在兩個<之間有一個空格。
或者:
while read line
do
command
done<<<"`command`"(例如"`find $path -type f -print`")
 
<<<可以讓字元串作為輸入檔案。
           

17、shfit造成參數變量号碼偏移

shift會移動變量,而且shift後面可以接數字,向左幾個參數的意思。。

18、sed

sed替換标記

sed元字元集

19、printf

printf的标志

字元 意義
将字段裡已格式化的值向左對齊
空白 在正值前置一個空格,在負值前置一個負号
+ 總是在數值之前放置一個正号或負号,即便是正值也是
# 下列形式選擇其一:%o有一個前置的O;%x與%X分别前有前置的Ox與OX.%e、%E與%f總是在結果中有一個小數點;%g與%G為沒有結尾的零。
以零填補輸出,而非空白。

printf格式訓示符:

項目 說明
%b 相對應的參數被視為含有要被處理的轉義序列之字元串,轉義序列
%c ASCII字元。顯示相對應參數的第一個字元
%d,%i 十進制整數
%e 符點格式([-]d.precisione[+-dd])
%E 符點格式([-]d.precisione[+-dd])
%f 符點格式([-]ddd.precisione)
%g %e與%f轉換,看哪一個較短,則删除結尾的零
%G %E與%f轉換,看哪一個較短,則删除結尾的零
%o 不帶正負号的八進制值
%s 字元串
%u 不帶正負号的十進制值
%x 不帶正負号的十六進制值。使用a至f表示10至15
%X 不帶正負号的十六進制值。使用A至F表示10至15
%% 字面上的%

20、awk

awk裡一般常用到的内建标量變量:

變量 說明
FILENAME 目前輸入檔案的名稱
FNR 目前輸入檔案的記錄數
FS 字段分隔字元(正規表達式)(預設為: " ")
NF 輸入的字段數
NR 到目前為止看到的輸入記錄總數。
OFS 輸出字段分隔字元(預設為: " ")
ORS 輸出記錄分隔字元(預設為: “\n”)
RS 輸入記錄分隔字元(預設為: “\n”),僅用于GAWK與MAWK裡的正規表達式。

基礎數值函數

函數 說明
atan2(y,x) 傳回y/x的反正切,值介于-Π與+Π之間
cos(x) 傳回x的餘弦值,該值介于-1與+1之間
exp(x) 傳回x的指數,ex
int(x) 傳回x的整數部分,截去前置的0
log(x) 傳回x的自然對數
rand(x) 傳回平均分布的虛拟随機r,0≤r≤1
sin(x) 傳回x的正弦值,該值介于-1與+1之間
sqrt(x) 傳回x的平方