1. 程式人生 > >【shell】十分鐘輕鬆入門;如果沒入門,您吐口口水再走吧!

【shell】十分鐘輕鬆入門;如果沒入門,您吐口口水再走吧!

## 一、什麼是shell? ### Shell是什麼? 1、Shell 是一個程式,Linux預設是用bash。 > Shell 是一個用 C 語言編寫的程式,既是一種命令語言,又是一種程式設計語言,是使用者使用Linux的橋樑。 > Linux上的Shell有很多種類,如mac上常用zsh, ubuntu用dash,而常用的Linux上則用bash,即Bourne Again Shell(/bin/bash) , Bourne Shell(/usr/bin/sh或/bin/sh)的擴充套件版 。 2、shell script是使用shell的指令碼。 > 我們通常說的 shell 是指 shell 指令碼, 即shell script,是一種為 使用shell 編寫的指令碼程式。它的檔案字尾為.sh,跟.bat、.js、.ptyhon都沒有什麼本質區別,無非不同環境下的可執行檔案。 3、所有指令碼無非是命令和流程控制的組合。 > if判斷條件,for、while迴圈,所有程式無出其右。 ### Shell程式設計能做什麼?有什麼優勢? 1、將我們常用的命令固化,將很多步驟做的事合為一個指令碼來做。 2、常用來進行我們程式部署時的啟動、停止開關。 3、作為一個指令碼語言,並且在Linux中有著天然的執行環境,輕量、方便。 ### 瞭解shell對 開發/運維/測試 有什麼好處? 1、輕鬆勝任部署工作; 2、熟悉Linux命令及其工作機制; 3、排查線上問題很方便; 4、擴寬解決問題的思路,拓展解決方案。 ## 二、shell的基本語法 我將shell的基本語法分為三塊:變數、運算子、條件、迴圈、函式。 PS.其實任何語言基本都是這幾塊組成。 ### 變數 #### 變數賦值 示例: war_name=yao。 注意: 1、變數名和等號之間不能有空格。 2、命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。 3、中間不能有空格,可以使用下劃線(_)。 4、不能使用標點符號,如點“.”。 5、不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。 #### 變數使用 示例: echo ${war_name} echo $war_name echo “war name is $war_name” #### 變數傳參 1、$# 傳遞到指令碼的引數個數 2、$1 傳遞到指令碼的第一個引數,1為n 3、$* 所有引數合成一個字串 4、$@ 所有引數,一個數組 5、$$ 當前指令碼執行的程序號,pid #### 第一個示例指令碼 vi 001.sh #!/bin/sh # author:姚毛毛的部落格 echo "Shell 傳遞引數例項!"; echo "第一個引數為:$1"; echo "引數個數為:$#"; echo "傳遞的引數作為一個字串顯示:$*"; 輸出結果: Shell 傳遞引數例項! 第一個引數為:1 引數個數為:5 傳遞的引數作為一個字串顯示:1 2 3 4 5 ### 運算子 & 算術命令 #### 常用運算子 運算子 | 說明 | ---|---| +、- 、* 、/、% | 數值: 加、減、乘、除、餘 !、-o、-a、&& 、`||` | 邏輯:非、與、或、and、or ==、!=、<、<= 、> 、>= | 比較:等於、非等於、小於、小於等於、大於、大於等於 =、+=、-=、*=、/=、&= | 賦值:等於、加等於、減等於、乘等於、除等於、餘等於 ~、`|`、&、^ | 按位比較: 按位取反、按位異或、按位與、按位或 << 、 >> | 位運算: 向左移位、向右移位 ++、-- | 自增、自減 #### 關係運算符 關係運算符不只支援數字比較,也是支援字元比較的。 關係運算符 | 說明 | 示例 ---|---|-- | -eq | 相等返回true,寫法 [$a -eq $b] | [ $a -eq $b ] 返回 true -ne | 不相等返回true | [ $a -ne $b ] 返回 true -gt | 大於返回true | [ $a -gt $b ] 返回 false -lt | 小於返回true | [ $a -lt $b ] 返回 true -ge | 大於等於返回true | [ $a -ge $b ] 返回 false -le | 小於等於返回true | [ $a -le $b ] 返回 true #### 檔案測試運算子 運算操作符與運算命令 | 說明 -- | -- -d file | 檢測檔案是否是目錄,是則返回 true。 寫法 [ -d $file ] -f file | 是否是普通檔案 -r file | 是否可讀 -w file | 是否可寫 -x file | 是否可執行 -s file | 是否為空(檔案大小是否大於0) -e file | 檢測檔案(包括目錄)是否存在 #### 運算操作符與運算命令 運算操作符與運算命令 | 說明 -- | -- [()] | 整數運算常用,效率高 let | 類似於“[()]” expr | 手工命令列計數器,一般用於整數值,也可用於字串 bc | 計算器 $[] | 整數運算 awk | shell命令神器 declare | 可定義變數和屬性,-i引數可定義整形變數 ### 條件 #### if if condition then command1 command2 ... commandN fi #### if else-if else if condition1 then command1 elif condition2 then command2 else commandN fi ### case case 值 in 模式1) command1 ;; 模式2) command1 ;; esac ### 迴圈 #### for for var in item1 item2 ... itemN do command1 command2 ... commandN done #### while while condition do command done condition為false,則停止 #### until until condition do command done condition為true則停止,一般不用 ### 函式 #### function [ function ] funname [()] { action; [return int;] } #### 示例 #!/bin/bash # author:yaomaomao demoFun(){ echo "這是我的第一個 shell 函式!" } echo "-----函式開始執行-----" demoFun echo "-----函式執行完畢-----“ 輸出結果: -----函式開始執行----- 這是我的第一個 shell 函式! -----函式執行完畢----- ### 特殊符號 符號型別 | 常用符號 ---|--- 註釋符 |# 管道符 |`|` 重定向輸入輸出 | <、<< ,> 、>>與 0 、1、2 匹配符 | ? 、* 引號 | ’’、”” 後臺程序符 |& 常執行命令 | nohup #### 符號用法與釋義 服務執行命令示例與釋義: nohup Xxx > /dev/null 2>&1 & 2>&1 的意思就是將標準錯誤重定向到標準輸出。這裡標準輸出已經重定向到了 /dev/null。那麼標準錯誤也會輸出到/dev/null nohup 為no hang up,不人為中斷會一直執行,一般與&一起用 & 表示後臺執行,終端退出則結束程序 測試一下重定向 ls 2>1 測試一下,不會報沒有2檔案的錯誤,但會輸出一個空的檔案1 ls xxx 2>1 沒有xxx這個檔案的錯誤輸出到了1中; ls xxx 2>&1 >與&之間不能有空格,此時可以觀察下結果。不會生成1這個檔案了,因為錯誤跑到標準輸出了; ls xxx > s.log 2>&1 # 實際上寫全應該是 ls xxx 1> s.log 2>&1 重定向符號>預設是1,錯誤和輸出都傳到s.log了 ### 指令碼執行 #### 執行示例 1、相對路徑 ./001.sh 2、絕對路徑 /root/shell/001.sh 3、不需要指令碼執行許可權,只需要bash許可權 sh 001.sh bash 001.sh 4、當前shell環境執行 source 001.sh 、 . 001.sh 1和2為開啟子程序執行指令碼,執行完畢,關閉子程序; 3、4則是在當前shell環境下執行,適合被執行程式中有對環境變數的增改,又希望保留到當前shell環境中的情況。 #### 指令碼實戰 1、批量建立檔案、資料夾 2、批量替換檔案內容 3、查詢大檔案並詢問刪除 4、自動刪除過期檔案 5、持續輸出磁碟、cpu、記憶體的監控結果 以上題目都是生產中會常用的一些指令碼。恩,具體的內容,嘿嘿,下次再