【shell】十分鐘輕鬆入門;如果沒入門,您吐口口水再走吧!
阿新 • • 發佈:2020-06-12
## 一、什麼是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、記憶體的監控結果
以上題目都是生產中會常用的一些指令碼。恩,具體的內容,嘿嘿,下次再