最近在梳理知識(shí),整理一下shell醇锚。
一、 ?基本語法
1.1 注釋
輸出幫助性文字 (EOF為邊界區(qū)分字符串隨意定義)
cat <<EOF
? ? ? ? ? ?幫助性文字區(qū)域
EOF
以#開頭的句子表示注釋?
Usage 示例
if [ $# -lt 3 ]; then
# 如果少于三個(gè)參數(shù)則顯示使用的信息,然后退出焊唬。
echo "Usage: `basename $0`arg1 arg2 arg3" >&2
exit 1
fi
1.2 特殊變量
變量 ? ? ? ? ? ? ? 含義
$0 ? ? ? ? ? ? ? ? 包含當(dāng)前 腳本全路徑的特殊變量
$1 -$9 ? ? ? ? ? ?位置參數(shù)1-9
${10} ? ? ? ? ? ? ?位置參數(shù)10
$# ? ? ? ? ? ? ? ? ?位置參數(shù)的個(gè)數(shù)
"$*"? ? ? ? ? ? ? ? 所有位置參數(shù)(作為單個(gè)字符串恋昼,被雙引號(hào)引住)
"$@"? ? ? ? ? ? ? 所有位置參數(shù)都分別被雙引號(hào)引住
${#*} ? ? ? ? ? ? ? ?傳遞到腳本中的命令行參數(shù)的個(gè)數(shù)
${#*} ? ? ? ? ? ? ? 傳遞到腳本中的命令行參數(shù)的個(gè)數(shù)
$?? ? ? ? ? ? ? ? ? 前一個(gè)命令執(zhí)行后的退出狀態(tài)返回值
$$ ? ? ? ? ? ? ? ? ? 當(dāng)前腳本進(jìn)程的PID
$- ? ? ? ? ? ? ? ? ? ?傳遞到腳本中的標(biāo)識(shí)
$_ ? ? ? ? ? ? ? ? ? 之前命令的最后一個(gè)參數(shù)
$! ? ? ? ? ? ? ? ? ? 運(yùn)行在后臺(tái)的最后一個(gè)作業(yè)的進(jìn)程ID(PID)。
注意點(diǎn):linux shell 中這兩個(gè)$* $@區(qū)別
相同點(diǎn):都是引用所有參數(shù)
不同點(diǎn):只在雙引號(hào)中體現(xiàn)出來
假設(shè)你的腳本運(yùn)行時(shí)你寫了三個(gè)參數(shù) 分別存儲(chǔ)在$1 $2 $3中
則"$*" 等價(jià)于 “$1 $2 $3"? ---》傳遞了一個(gè)參數(shù)
而“$@" 等價(jià)于 "$1"? "$2"? "$3"? ---》傳遞了三個(gè)參數(shù)
1.3 變量基礎(chǔ)知識(shí)
1.4測(cè)試操作
1.4.1算術(shù)比較操作符
-eq(等于) -ne(不等于) -lt或<(小于) ?-le或<=(小于等于) -gt或>(大于) -ge(大于等于)
1.4.2字符串比較操作符
= ,==,!=,<,>,-z(字符串為空),-n(字符串不為空)
1.4.3參數(shù)替換和擴(kuò)展
${ : }帶冒號(hào)的表達(dá)式
${var:-DEF} ? ? ? ? 若var沒被聲明或值為null, 整個(gè)參數(shù)替換表達(dá)式為DEF
${var:=DEF} ? ? ? ?若var沒被聲明或值為null, 整個(gè)參數(shù)替換表達(dá)式為DEF赶促,且var的值為DEF
${var:+OTHER} ? ? ? ? 如果var被設(shè)置了, 整個(gè)參數(shù)替換表達(dá)值為OTHER, 否則為null字符串
${var:?ERR_MSG} ? ? ? 如果var沒被設(shè)置, 那就打印$ERR_MSG
表達(dá)式 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?含義
${var_DEFAULT} ? ? ? ? ? ? ? ? ? ? ? 如果var沒被聲明, 就以$DEFAULT作為其值 *
${var=DEFAULT} ? ? ? ? ? ? ? ? ? ? ? 如果var沒被聲明, 就以$DEFAULT作為其值 *
${var+OTHER} ? ? ? ? ? ? ? ? ? ? ? ? ? 如果var聲明了, 其值就是$OTHER, 否則為null字符串
${var?ERR_MSG} ? ? ? ? ? ? ? ? ? ?如果var沒被聲明, 那就打印$ERR_MSG*
${! }帶!的表達(dá)式
${!varprefix*}? ${!varprefix@} ??將帶有前綴varprefix的參數(shù)名打印出來
${!arg[*]} ?打印arg數(shù)據(jù)組的下標(biāo)
${ }帶正則匹配的表達(dá)式
${var#word} ? ?#最短匹配 ? ?
${var##word} ? ?##最長(zhǎng)匹配
從頭開始掃描word液肌,將匹配word正則表達(dá)式的字符過慮掉
${var%word} ? ?%最短匹配
${var%%word} ? %%最長(zhǎng)匹配
從尾開始掃描word,將匹配word正則表達(dá)式的字符過濾掉
1.5 常用的命令
1.5.1標(biāo)準(zhǔn)輸入/輸出/錯(cuò)誤
0——stdin(標(biāo)準(zhǔn)輸入)
1——stdout(標(biāo)準(zhǔn)輸出)
2——stderr(標(biāo)準(zhǔn)錯(cuò)誤)
<輸入重定向 ? ?—— ?將<右側(cè)信息做為左側(cè)的輸入信息
>輸出重定向 ?—— ?將>左側(cè)信息輸出至右側(cè)文件中
/dev/null 無底洞
“2>/dev/null” 代表忽略掉錯(cuò)誤提示信息?
>/dev/null 2>&1 標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都重定向到/dev/null
2>&1>/dev/null ?標(biāo)準(zhǔn)錯(cuò)誤打印到屏幕鸥滨,而標(biāo)準(zhǔn)輸出不打印到屏幕
&>/dev/null 通通重定向到/dev/null
1.5.2 常用命令
獲取文件名和路徑
basename?path ? ? ?從path中分離出文件名
示例 echo "Usage:`basename $0` give me a file"
dirname path ? ??返回文件所在路徑
script option file ? ?在當(dāng)前會(huì)話中輸入此命令嗦哆,退出會(huì)話時(shí),將輸入記錄下并附加到指定文件的末尾
替換
tr [options]? [source-char-list]? ? ? ? [replace-char-list]? ? ? <? ? filename
將replace-char-list的值替換source-char-list中相應(yīng)位置中的值婿滓,并輸出到屏幕中吝秕,filename文件不改變內(nèi)容
[replace-char-list]專用的設(shè)定
[char*] ?重復(fù)指定的字符到source-char-list相同長(zhǎng)度為止
[char*rep]將char重復(fù)rep次數(shù)
source-char-list > replace-char-list時(shí),source多出來的字符都會(huì)和replace中最后一個(gè)字符相對(duì)應(yīng)
source-char-list < replace-char-list時(shí)空幻,replace中多余的部分被拋棄烁峭。
[source-char-list]專用的設(shè)定
-s 有連續(xù)的source-char-list里的字符時(shí),縮減為1個(gè)秕铛。
查找與替換
find
grep ?查找文本
sed ? 查找與替換 ??
注意sed是以行對(duì)輸入進(jìn)行處理约郁;處理的不是原文件而是原文件的拷貝
1.6正則表達(dá)式
基礎(chǔ)正則表達(dá)式BRE
擴(kuò)展正則表達(dá)式ERE