最近在梳理知識,整理一下shell。
一、 ?基本語法
1.1 注釋
輸出幫助性文字 (EOF為邊界區(qū)分字符串隨意定義)
cat <<EOF
? ? ? ? ? ?幫助性文字區(qū)域
EOF
以#開頭的句子表示注釋?
Usage 示例
if [ $# -lt 3 ]; then
# 如果少于三個參數則顯示使用的信息,然后退出。
echo "Usage: `basename $0`arg1 arg2 arg3" >&2
exit 1
fi
1.2 特殊變量
變量 ? ? ? ? ? ? ? 含義
$0 ? ? ? ? ? ? ? ? 包含當前 腳本全路徑的特殊變量
$1 -$9 ? ? ? ? ? ?位置參數1-9
${10} ? ? ? ? ? ? ?位置參數10
$# ? ? ? ? ? ? ? ? ?位置參數的個數
"$*"? ? ? ? ? ? ? ? 所有位置參數(作為單個字符串,被雙引號引住)
"$@"? ? ? ? ? ? ? 所有位置參數都分別被雙引號引住
${#*} ? ? ? ? ? ? ? ?傳遞到腳本中的命令行參數的個數
${#*} ? ? ? ? ? ? ? 傳遞到腳本中的命令行參數的個數
$?? ? ? ? ? ? ? ? ? 前一個命令執(zhí)行后的退出狀態(tài)返回值
$$ ? ? ? ? ? ? ? ? ? 當前腳本進程的PID
$- ? ? ? ? ? ? ? ? ? ?傳遞到腳本中的標識
$_ ? ? ? ? ? ? ? ? ? 之前命令的最后一個參數
$! ? ? ? ? ? ? ? ? ? 運行在后臺的最后一個作業(yè)的進程ID(PID)。
注意點:linux shell 中這兩個$* $@區(qū)別
相同點:都是引用所有參數
不同點:只在雙引號中體現(xiàn)出來
假設你的腳本運行時你寫了三個參數 分別存儲在$1 $2 $3中
則"$*" 等價于 “$1 $2 $3"? ---》傳遞了一個參數
而“$@" 等價于 "$1"? "$2"? "$3"? ---》傳遞了三個參數
1.3 變量基礎知識

1.4測試操作
1.4.1算術比較操作符
-eq(等于) -ne(不等于) -lt或<(小于) ?-le或<=(小于等于) -gt或>(大于) -ge(大于等于)
1.4.2字符串比較操作符
= ,==,!=,<,>,-z(字符串為空),-n(字符串不為空)
1.4.3參數替換和擴展
${ : }帶冒號的表達式
${var:-DEF} ? ? ? ? 若var沒被聲明或值為null, 整個參數替換表達式為DEF
${var:=DEF} ? ? ? ?若var沒被聲明或值為null, 整個參數替換表達式為DEF,且var的值為DEF
${var:+OTHER} ? ? ? ? 如果var被設置了, 整個參數替換表達值為OTHER, 否則為null字符串
${var:?ERR_MSG} ? ? ? 如果var沒被設置, 那就打印$ERR_MSG
表達式 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?含義
${var_DEFAULT} ? ? ? ? ? ? ? ? ? ? ? 如果var沒被聲明, 就以$DEFAULT作為其值 *
${var=DEFAULT} ? ? ? ? ? ? ? ? ? ? ? 如果var沒被聲明, 就以$DEFAULT作為其值 *
${var+OTHER} ? ? ? ? ? ? ? ? ? ? ? ? ? 如果var聲明了, 其值就是$OTHER, 否則為null字符串
${var?ERR_MSG} ? ? ? ? ? ? ? ? ? ?如果var沒被聲明, 那就打印$ERR_MSG*
${! }帶!的表達式
${!varprefix*}? ${!varprefix@} ??將帶有前綴varprefix的參數名打印出來
${!arg[*]} ?打印arg數據組的下標
${ }帶正則匹配的表達式
${var#word} ? ?#最短匹配 ? ?
${var##word} ? ?##最長匹配
從頭開始掃描word,將匹配word正則表達式的字符過慮掉
${var%word} ? ?%最短匹配
${var%%word} ? %%最長匹配
從尾開始掃描word,將匹配word正則表達式的字符過濾掉

1.5 常用的命令
1.5.1標準輸入/輸出/錯誤
0——stdin(標準輸入)
1——stdout(標準輸出)
2——stderr(標準錯誤)
<輸入重定向 ? ?—— ?將<右側信息做為左側的輸入信息
>輸出重定向 ?—— ?將>左側信息輸出至右側文件中
/dev/null 無底洞
“2>/dev/null” 代表忽略掉錯誤提示信息?
>/dev/null 2>&1 標準輸出和標準錯誤都重定向到/dev/null
2>&1>/dev/null ?標準錯誤打印到屏幕,而標準輸出不打印到屏幕
&>/dev/null 通通重定向到/dev/null
1.5.2 常用命令
獲取文件名和路徑
basename?path ? ? ?從path中分離出文件名
示例 echo "Usage:`basename $0` give me a file"
dirname path ? ??返回文件所在路徑
script option file ? ?在當前會話中輸入此命令,退出會話時,將輸入記錄下并附加到指定文件的末尾
替換
tr [options]? [source-char-list]? ? ? ? [replace-char-list]? ? ? <? ? filename
將replace-char-list的值替換source-char-list中相應位置中的值,并輸出到屏幕中,filename文件不改變內容
[replace-char-list]專用的設定
[char*] ?重復指定的字符到source-char-list相同長度為止
[char*rep]將char重復rep次數
source-char-list > replace-char-list時,source多出來的字符都會和replace中最后一個字符相對應
source-char-list < replace-char-list時,replace中多余的部分被拋棄。
[source-char-list]專用的設定
-s 有連續(xù)的source-char-list里的字符時,縮減為1個。
查找與替換
find
grep ?查找文本
sed ? 查找與替換 ??
注意sed是以行對輸入進行處理;處理的不是原文件而是原文件的拷貝
1.6正則表達式
基礎正則表達式BRE
擴展正則表達式ERE