shell指令碼編程訣竅--適用於linux,bash等 所學技術總結

來源:互聯網
上載者:User

標籤: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等 所學技術總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.