標籤:shell 指令碼命令相關
看過不多的幾本shell編程和linux命令方面的書,這一本給我的印象尤為深刻,雖然仍然是入門書籍,但是覺得比以前看的要更細,更廣一點。今天剛看完,也是今天才開始決定開部落格的 ,就以這本書中內容中技術上的總結,作為我第一篇技術部落格好了。
啟動互動式shell 首先會讀取/etc/profile ~/.profile ~/.bashrc /etc/bashrc
less 選項 -X 可以防止螢幕重新整理,用less前終端顯示的內容也不會丟失,這個好像是控制台的預設模式。
alias 別名 用unalias 可以取消, 別名在需要重複鍵入複雜值的時候最為有用,還有就是rm 等危險操作 加入-i選項,防止誤操作 指令前添加\可以不使用別名
history 首先當前shell的命令在退出登入前都只會儲存在記憶體裡,用history命令調用,不在.bash_history檔案裡面
HISTSIZE定義最多儲存命令數,
HISFILESIZE定義最大歷史檔案大小,
HISTCONTROL定義忽略前置空格,
HISTINGORE定義不需要儲存的命令 ,其中ignoredups忽略重複行,ignorespace忽略有前置空格的行,ignoreboth忽略兩者
HISTFILE定義曆史檔案
shell 所有參數$* [email protected] 後者為分開的 ,切記使用時加上雙引號,不然讀入的參數仍然是以空格為分隔傳給變數的; $#為參數的總個數
關於shell中調用函數,函數的傳回值 有兩種傳遞方式,
1 通過exit return 這樣 在調用之後立刻用$? 這個值可以獲得傳出的值
2 通過 a=function 將函數執行得到的 所有echo產生的結果賦值給a,同時$?可以獲得成功函數與否,0成功 1 失敗
shopt 命令用於管理bash的各種選項 主管BASHOPOTS
set 命令用於管理SHELLOPTS 前者主要針對bash 而這個針對的是shell環境 set 中以‘-’號開啟功能 ‘+’號取消功能
其中pipefail開啟後 使用管道命令時退出碼在管道的任一階段失敗後都會返回非0
同樣 使用PIPESTATUS數組也可以 不過要一次性記錄數組所有值,不然值會被接下來的任意命令的結果覆蓋,從管道最右邊開始是0
BASH_COMMAND 顯示當前正在啟動並執行命令,在中斷時比較有用
有4個有用的陣列變數我記著,FUNCNAME用於顯示當前正在啟動並執行函數名,從0開始往上回溯調用者
BASH_SOURCE顯示正在啟動並執行指令碼名 ,也是往上回溯
LINENO顯示在當前指令碼中的行數
BASH_LINENO[i] 表示源檔案中調用FUNCNAME[i] 所使用的行號 所以在被調用者中只要用BASH_LINENO[0]就可以表示調用者中的行數了
BASH_VERSION 用於記錄bash版本名稱
PWD 為pwd命令結果 而 OLDPWD 為前一個目錄 可用`cd -`命令返回
TIMEFORMAT 用於控制time命令輸出的格式,可以用來檢測進程已耗用時間time -p commmand, 分為總時間,使用者空間 系統空間時間
PPID為調用者的pid 而 $$顯示當前進程的pid
RANDOM為0到32767之間的隨機數,
SECONDS會每秒加一 預設是當前shell登陸的時間
REPLAY為預設輸入,一般是上一次的輸入
BASH_XTRACED 這個變數 當set -x 設定時 會把set -x 的輸出 輸出到變數指定的檔案描述符中去 ? 待實驗 一定要是檔案描述符嗎
GLOBIGNORE 變數用於讓*萬用字元 忽略某些匹配模式的結果,用冒號隔開
IFS 是bash 使用者分隔輸入的 字元 空格 定位字元 還有分行符號
TMOUT 和read -t 同樣用於逾時 設定 還有 timeout命令
shell匹配的 用*匹配0到無窮個 ?匹配1個必須一個, 還有{}大括弧可以放入所有可選的項目,用逗號分隔
開啟shopt -s dotglob 可以匹配到點開頭的檔案 . 和.. 除外
nullglob 可以讓萬用字元匹配不到的時候 不把萬用字元本身當成匹配項目
extglob 可以擴充匹配 比如 ?(models)匹配任意一個 +()匹配一到多個 *()匹配0到多
@()匹配一個 !()匹配除一個以外的
幾種可用類 這裡記一下 [a-z] 相當於 [[:alpha::] [[:alnum:]] [[:blank:]]空格定位字元 [[:cntrl:]]非列印控制字元 [[:dight:]] [[:graph:]]字母數字標點 [[:lower:]] [[:upper:]] [[:print:]]可列印字元 [[:punct:]] [[:space:]]空白字元 [[:xdigit:]]
shell中單引號中所有字元都不會被解釋 雙引號中除$引用變數以外也不會被解釋
特殊字元如 分號 驚嘆號(曆史命令) &符號 各種括弧等 可用反斜線轉義
test 與 []命令效果是一樣的, 其中]是[的參數 沒有也不要緊的 有-O -G是否屬於目前使用者 和組 -U 上次訪問後是否修改過
使用 [[ args =~ Regex ]] 可以帶入Regex 用右邊匹配左邊的形式 可以用 (.+) (.*) ([email protected])等 表示有1個及以上 0到多個 1個字元 匹配後 利用BASH_REMATCH數組可以取出各個匹配項目
case 語句一共有3種結句方式 ;; 這個最普通 ,就是C語言switch裡的break的意思。
;;& 這個表示還要接下去匹配工作
;& 這個表示接下來的一項也當做匹配上了,然後結束
迴圈 最後可以用 < 符號 將所要的內容從檔案中輸入
for迴圈 有 for a in b 和 for (( ; ; )) 這種C語言方式 這兩種
continue 和break 後面跟數字可以指定跳出幾重迴圈 很方便
select a in b 中,會自動產生菜單 利用PS3變數作為提示符, 使用者輸入的數字為REPLY變數,而a為輸入的數字所對應的項目名稱 select產生的菜單只能用中斷的方法退出 他是無限迴圈的
變數的數字運算 可是使用 let命令 expr 命令 還有 (( ))括弧進行 其中 第三種要得到求出的值的話,需要在前面加上$,優點是內部計算時不用在變數裡面加$符號
變數長度是 ${#para} 的值
裁剪變數: ${para:pos:num} 變數 從pos位置(從0開始計數)開始的前num個字元被裁剪然後顯示,其中num欄位和前面的冒號可以省略 如果要從末尾開始計算裁剪位置 就使用: -pos 記住符號和冒號之間要有一個空格
還有一種模式比對裁剪 利用{para#mod} {para##mod} {para%mod} {para%%mod} 兩個符號的是貪婪匹配 總是匹配最長的一段,一個符號則匹配最短的一段,#是從開頭 %是從結尾, mod地區使用bash的匹配和通配模式
{para^character}符號可以改成^^ , ,, 共4種 分別表示將para中對應字母改成大寫或小寫, 雙個字元表示全部改 單個的話只匹配變數開頭的那一個字元而已 不管匹配不匹配上。
變數尋找替換 ${var//a/b} 在var中把a替換成b,那個雙斜杠表示全部替換,如果換成單斜杠就只替換第一個 如果要替換開頭的字元 用的 不是 ^字元 而是用#字元放在開頭 而%表示結尾 萬用字元也可以使用 ; 如果要刪除的話/b部分省略就行了
提供預設值 ${a:-b} 若a不存在或為空白 則用b {a:=b} 同前 單a會被賦值b
[a?b] 有值時 即使為空白 也是a 否則b [a+b] 有值為b 沒值為a
$[!var] 為2次取值, 會先引用$var 在將其值進行引用
getopts 能處理簡單的命令列參數,將參數 選項分離存放 格式 getopts optstring name 其中 optstring 中指定選項以及是否要參數 後加冒號, name中存放當前選項,OPTARG中存放當前選項的參數 ,OPTIND 中存放下一個將要查詢到的選項的 位置的索引 從1開始的
數組可以一次性賦值 可以稀疏賦值(不按照序號連續賦值 ),有了值後 可以再增加a=( ${a[@] b} 即可 或者應用 ${#a[@]}表示數組元素總數 或者減少 用unset即可 直接unset 數組名則是取消整個數組,
數組賦值的輸入的話 不一定是以空格為間隔的 這個只要修改IFS就可以了 注意先儲存一下 或者 可以把IFS的修改和指令運行放在同一行 這樣IFS修改有效性就只有這一行了。
如果用IFS 和 read -a 讀入數組相組合的話,同一行的輸入會被分隔字元分成多份放在數組的每一項裡面
利用變數裁剪的方法 也可以裁剪數組總元素
關聯陣列 可以使用字串作為數組索引 還有 可以反向尋找 for b in ${!a[@]} ,此時b的值時索引的值 a[b]得到的是數組裡的對應結果
可以在一個數組中添加另一個數組 利用 a+=( “${b[@]}” ) 即可
nohup 用於後台運行 終端關閉也無妨
wait 可以選擇要等待結束的 進程 (必須是當前進程的子進程 不然直接返回)
互動式登入shell /etc/profile ~/.profile ~/.bashrc /etc/bashrc
互動式非登入shell 在shell裡鍵入shell時讀入 ~/.bashrc /etc/bashrc
非互動式shell 常用於指令碼中 讀取BASH_ENV變數 沒有則不讀取
使用history命令的!可以調出使用過的命令 後面加數字 或者命令的前幾個字母都可以
使用stat命令可以獲得一個檔案的許可權的具體資訊 可以類比ls 命令較有用
cat命令可以標記行號,非空行 保留單個空白行 , 顯示非列印字元-v 等
maktemp命令可以製造零時檔案名稱,可以用X指定隨機產生的字母的個數
重新導向的<<符號 後面如果用<<-的話 之後輸入的每行文字全部忽略前置空格,這有助於代碼的層次清晰
使用join組合兩個檔案時,可以選擇按欄位組合 選擇顯示全部內容等
cut命令中的 -t 如果指定空格 則只能識別一個空格 如果每行裡面的空格數不一樣,會導致域選擇的錯誤
shuf 指令用於隨機排列指定序列, 可以是直接在參數裡指定,利用-e 或者 指定檔案 ,檔案裡每行寫好要隨機的字元, 或者可以用-i 來使用 1-6這樣的形式
paste 也是把兩個檔案放在一起 預設會全部貼起來,不一樣的部分也不管,就是單純的把相對應的行號相同的行貼在一起,可以用-d指定分隔字元,可以指定多個,放在不同的兩列之間
pr 可以按照指定每行多少個進行列印,使用-T可以去掉格式的表頭
printf指令同C語言一樣指定格式字串
tr命令使用[] 可以把需要匹配的字元包括進去,或者用[:alpha:]這樣的等等
uniq 命令-w -s 可以指定輸出或者忽略前面n個字元, 使用-u -d 可以指定輸出非重複行 或 重複行 使用-f則可以指定比較時要忽略前面的幾個欄位 ,欄位用空格 定位字元隔開
factor命令用於輸出指定數位素數
id groups getent其中第三個用於擷取指定資料庫裡的指定資訊
md5sum用於計算校正值,如果加入-c 則對於計算過值並排放好的文本可以用來檢驗校正值 ,當然要放在同一目錄底下
mkfifo用於製造管道檔案,不過管道必須雙向開啟不然無法正常工作,
seq 用於 輸出一個序列, 可以用seq a b c 中的b來指定步長
timeout則用於製造時間限制,timeout -s signal (time) 指定經過time秒後發送signal訊號給程式
xargs 用於將參數傳給指定的命令 可以選擇一次傳幾個,
yes 用於將一個值不斷的重複輸出 用於需要不斷回答的地方
暫且總結了這麼多 比較亂 算是給自己的一個複習的參考 今後不斷鞏固完善
shell指令碼編程訣竅--適用於linux,bash等 所學技術總結