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的平方 |