1. Shell簡(jiǎn)介
1.1 什么是Shell
- 概念: Shell即使一種命令語言属瓣,也是一個(gè)用C語言編寫的程序(命令解析器)垃喊。
- 作用: 主要提供一個(gè)借口使用戶與內(nèi)核交操作。
-
流程: 接受用戶輸入的命令并且進(jìn)行解釋(轉(zhuǎn)換為計(jì)算機(jī)可以理解的機(jī)器碼)惫叛,然后將命令送入內(nèi)核去執(zhí)行挤茄,最后將結(jié)果返回給用戶。
Linux系統(tǒng)結(jié)構(gòu).png
1.2 Shell的種類
- 含義:不同的命令解析器(程序不斷升級(jí))
- 區(qū)別:提示符不同纠俭、語法不同宁玫、展示效果不同等
- 常用:sh、csh柑晒、ksh欧瘪、bash等
sh (Bourne Shell) AT&T Bell實(shí)驗(yàn)室的Steve Bourne開發(fā) (最早的)
csh (C Shell) 加州伯克利大學(xué)的Bill Joy (更強(qiáng))
ksh (Korn Shell) AT&T Bell實(shí)驗(yàn)室的David Korn開發(fā) (升級(jí))
bash(Bourne Again Shell) 自由軟件基金會(huì)(GNU)開發(fā)的一個(gè)Shell (統(tǒng)一)
- 常見命令:
命令 | 含義 |
---|---|
cat /etc/shells | 查看系統(tǒng)支持的shell類型 |
echo $SHELL | 查看當(dāng)前使用的shell類型 |
useradd [參數(shù)] 用戶名(-g 指定用戶組,-c 備注匙赞,-s 登錄執(zhí)行的命令佛掖,-d 家目錄) | 用戶添加 |
usermod 參數(shù) 用戶名(以上四個(gè) + -l 改名) | 用戶編輯 |
userdel 用戶名 | 用戶刪除 |
passwd 用戶名 | 修改密碼 |
例如:修改test用戶的登錄執(zhí)行命令種類為bash
sudo usermod -s /bin/bash test1
2. Shell腳本
除了挨個(gè)執(zhí)行命令外,還一個(gè)創(chuàng)建一個(gè)腳本文件批量處理涌庭。
創(chuàng)建腳本并執(zhí)行的步驟:
- 創(chuàng)建一個(gè)腳本文件并用vi模式打開:
vi test.sh
# 可以不加后綴
- 指定運(yùn)行腳本文件的命令解析器類型芥被,在腳本文件中寫入代碼:
#!/bin/bash
# 指定為bash類型
- 寫入要執(zhí)行的代碼:
echo hello
# 輸出字符串hello
- 執(zhí)行腳本語法:
編號(hào) | 方法 |
---|---|
方法1 | sh 路徑及文件名(推薦) |
方法2 | /bin/bash 路徑及文件名 |
方法3 | source 路徑及文件名 |
方法4 | . 路徑及文件名.sh |
3. Shell變量
3.1 本地變量
- 概念:只對(duì)當(dāng)前shell進(jìn)程有效(ps. 對(duì)當(dāng)前進(jìn)程的子進(jìn)程和其它shell進(jìn)程無效)
- 語法:
設(shè)置:變量名=變量值(等號(hào)不能有空格)
刪除:unset 變量名
輸出:echo $變量名
MacBook-Pro:~ test$ VAR_T1=123 #定義變量
MacBook-Pro:~ test$ echo $VAR_T1 #輸出變量
123
MacBook-Pro:~ test$ echo ${VAR_T1}456 #輸出變量,添加{}避免混淆
123456
MacBook-Pro:~ test$ unset VAR_T1 #刪除變量
MacBook-Pro:~ test$ echo $VAR_T1
3.2 環(huán)境變量
- 概念:對(duì)當(dāng)前shell進(jìn)程和子進(jìn)程有效坐榆,其他shell進(jìn)程無效拴魄。通過修改配置文件,可以定義全局都生效的環(huán)境變量席镀。
- 語法:
export 變量名=變量值
對(duì)所有shell進(jìn)程都生效:
vi /etc/profile #在該配置文件中定義環(huán)境變量
source /etc/profile #讓新建立的環(huán)境變量立刻生效無需重新啟動(dòng)系統(tǒng)
3.3 局部變量
- 概念:函數(shù)調(diào)用時(shí)創(chuàng)建匹中、調(diào)用完畢時(shí)銷毀。
- 語法:
local 變量名=變量值
MacBook-Pro:~ test$ function a(){
> local VAR_T2=123
> echo $VAR_T2
> }
MacBook-Pro:~ test$ a
123
MacBook-Pro:~ test$ echo $VAR_T2
3.4 位置變量
- 概念:指程序運(yùn)行時(shí)動(dòng)態(tài)傳入的參數(shù)豪诲。
- 語法:
傳參:sh 路徑及文件名.sh 參數(shù)1 ... 參數(shù)n
輸出:echo $1 / .. / echo $n
MacBook-Pro:shell test$ cat test3.sh
#!/bin/bash
echo $[${1}+${2}] #算數(shù)代換
MacBook-Pro:shell test$ sh test3.sh 5 5
10
3.5 特殊變量
- 特殊變量的介紹
變量 | 含義 |
---|---|
$0 | 當(dāng)前腳本的文件名 |
$n | 傳遞給腳本或函數(shù)的參數(shù)顶捷。n 是一個(gè)數(shù)字,表示第幾個(gè)參數(shù)屎篱。例如服赎,第一個(gè)參數(shù)是$1,第二個(gè)參數(shù)是$2交播。 |
$# | 傳遞給腳本或函數(shù)的參數(shù)個(gè)數(shù)重虑。 |
$* | 傳遞給腳本或函數(shù)的所有參數(shù)。 |
$@ | 傳遞給腳本或函數(shù)的所有參數(shù)秦士。被雙引號(hào)(" ")包含時(shí)缺厉,與 $* 稍有不同,下面將會(huì)講到伍宦。 |
$? | 上個(gè)命令的退出狀態(tài)芽死,或函數(shù)的返回值。 |
$$ | 當(dāng)前Shell進(jìn)程ID次洼。對(duì)于 Shell 腳本关贵,就是這些腳本所在的進(jìn)程ID限寞。 |
- 特殊變量的應(yīng)用場(chǎng)景
變量 | 應(yīng)用場(chǎng)景 |
---|---|
$n | 根據(jù)傳遞的參數(shù)安裝指定軟件 |
$$ | 腳本執(zhí)行時(shí)輸出進(jìn)程編號(hào)便于卡死時(shí)結(jié)束進(jìn)程(注:sleep 秒數(shù)) |
3.6 其他
3.6.1 命令代換
- 概念:通過語法反引號(hào)或$(名稱)實(shí)現(xiàn)先解析shell指令悲柱,再賦值給變量。
- 示例:
MacBook-Pro:shell test$ VARDATE=date
MacBook-Pro:shell test$ echo $VARDATE
date
MacBook-Pro:shell test$ VARDATE=`date`
MacBook-Pro:shell test$ echo $VARDATE
2018年10月29日 星期一 20時(shí)12分00秒 CST
MacBook-Pro:shell test$ VARDATE=$(date)
MacBook-Pro:shell test$ echo $VARDATE
2018年10月29日 星期一 20時(shí)12分14秒 CST
3.6.2 算術(shù)代換
- 概念:通過$(()) 或 $[]實(shí)現(xiàn)運(yùn)算功能悯许。
- 示例:
MacBook-Pro:shell test$ echo 8 + 2
8 + 2
MacBook-Pro:shell test$ echo $[8 + 2]
10
4. Shell流程控制(判斷)
4.1. 條件測(cè)試
- 說明:通過test或 [] 可以測(cè)試一個(gè)條件是否成立亥啦。
- 語法:
語法:test 值1 條件 值2
或
語法: [ 值1 條件 值2 ]
腳下留心:0-代表結(jié)果成立炭剪,1-代表結(jié)果不成立;中括號(hào)內(nèi)部?jī)啥吮仨毤涌崭?/p>
- 數(shù)值測(cè)試:
參數(shù) | 說明 |
---|---|
-eq | 等于則為真 |
-ne | 不等于則為真 |
-gt | 大于則為真 |
-ge | 大于等于則為真 |
-lt | 小于則為真 |
-le | 小于等于則為真 |
- 文件測(cè)試:
參數(shù) | 說明 |
---|---|
-e 文件名 | 文件存在則為真 |
-r 文件名 | 文件存在且可讀則為真 |
-w 文件名 | 文件存在且可寫則為真 |
-x 文件名 | 文件存在且可執(zhí)行則為真 |
-s 文件名 | 文件存在且至少有一個(gè)字符則為真 |
-d 文件名 | 文件存在且為目錄則為真 |
-f 文件名 | 文件存在且為普通文件則為真 |
- 字符串測(cè)試:
參數(shù) | 說明 |
---|---|
= | 相等則為真 |
!= | 不相等則為真 |
4.2. if...elif...else語句
- 語法:
if 條件1
then
????命令1
elif 條件2
then
????命令2
else
????命令3
fi
- 示例1:判斷成績(jī)(>=90優(yōu)秀翔脱,>=80良好奴拦,>=60及格,>=0不及格):
#!/bin/bash
#接受分?jǐn)?shù)
SCORE=$1
#判斷
if [ $SCORE -ge 90 ]
then
echo "優(yōu)秀"
elif [ $SCORE -ge 80 ]
then
echo "良好"
elif [ $SCORE -ge 60 ]
then
echo "及格"
elif [ $SCORE -ge 0 ]
then
echo "不及格"
else
echo "分?jǐn)?shù)不合法"
fi
- 示例2:判斷當(dāng)前執(zhí)行腳本是否是root用戶:
#!/bin/bash
WHO=$(whoami)
if [ $WHO != 'root' ]
then
echo "Error: You must be root to run this script!"
exit 1
fi
4.3. case語句
- 語法:
case $變量名 in
???? "值1")
???? ???? 如果變量的值等于值1届吁,則執(zhí)行程序1
????;;
???? "值2")
???? ???? 如果變量的值等于值2错妖,則執(zhí)行程序2
????;;
????....
???? *)
???? ????如果以上都不成立,則執(zhí)行此程序
????;;
esac
-
需求:執(zhí)行腳本讓用戶輸入
yes - installing...
no - skip
其他 - Please enter the correct option
#!/bin/bash
read -p "Please Input yes/no: " Select_Id
case $Select_Id in
"yes")
echo 'installing...'
;;
"no")
echo 'skip'
;;
*)
echo 'Please enter the correct option'
;;
esac
5. Shell循環(huán)
5.1 for循環(huán)
- 語法:
for 變量名 in 值1 ... 值N
do
????命令
done
- 示例1:輸出6個(gè)數(shù)
#!/bin/bash
for i in 1 2 3 4 5 6
do
echo $i
Done
- 示例2:輸出指定目錄下得所有文件名
#!/bin/bash
cd $1
filenames=$(ls)
for name in $filenames
do
echo $name
done
5.2 while循環(huán)
- 語法:
while 條件
do
????命令
done
- 示例1:輸出1-10
#!/bin/bash
i=1
while [ $i -le 10 ]
do
echo $i
i=$(($i+1))
done
6. 計(jì)劃任務(wù)
6.1. 簡(jiǎn)介
- 概念:約定時(shí)間執(zhí)行指定任務(wù)(或執(zhí)行指定腳本文件)
- 舉例1:通過計(jì)劃任務(wù)定時(shí)發(fā)布文章
- 舉例2:通過計(jì)劃任務(wù)凌晨3點(diǎn)將測(cè)試服務(wù)器項(xiàng)目代碼同步到線上服務(wù)器
6.2. 使用
- 步驟1:通過命令【crontab -e】編寫計(jì)劃任務(wù)
- 步驟2:按【i】鍵編寫疚沐,最后按【esc】【:wq】保存并退出
多學(xué)一招:crontab -e語法同vi編輯器命令 (-e edit縮寫)
通過crontab -l 可以查看已有的任務(wù) (-l list縮寫)
通過crontab -r 可以移除已有的任務(wù) (-r remove縮寫)
6.3. 語法
* * * * * 任務(wù)
分 時(shí) 日期 月 星期幾
項(xiàng)目 | 含義 | 范圍 |
---|---|---|
第一個(gè)“*” | 一小時(shí)中的第幾分鐘 | 0-59 |
第二個(gè)“*” | 一天中的第幾小時(shí) | 0-23 |
第三個(gè)“*” | 一月中的第幾天 | 1-31 |
第四個(gè)“*” | 一年中的第幾天 | 1-12 |
第五個(gè)“*” | 一周中的星期幾 | 0-7(0和7代表星期天) |
特殊符號(hào) | 含義 |
---|---|
* | 代表任何時(shí)間暂氯。比如第一個(gè)“*”就代表一小時(shí)中的沒分鐘都執(zhí)行一次 |
, | 代表不連續(xù)的時(shí)間,比如“0 8,12,16 * * *”就代表在每天的8點(diǎn)0分亮蛔,12點(diǎn)0分痴施,16點(diǎn)0分都執(zhí)行一次命令 |
- | 代表連續(xù)的時(shí)間范圍。比如“0 5 * * 1-6”代表在周一到周六的凌晨5點(diǎn)0分執(zhí)行命令 |
*/n | 代表每隔多久執(zhí)行一次究流。比如“*/10 * * * *”辣吃,代表每隔10分鐘就執(zhí)行一遍命令 |
- 例子:每分鐘向tmp.txt文件中寫入數(shù)字6:
*/1 * * * * echo 9 >> /tmp.txt
其他案例:
???時(shí)??????????間??? | 含義 |
---|---|
45 22 * * * | 在每天22點(diǎn)45分執(zhí)行命令 |
0 17 * * 1 | 每周1的17點(diǎn)0分執(zhí)行命令 |
0 5 1,15 * * | 每月1號(hào)和15號(hào)的凌晨5點(diǎn)0分執(zhí)行命令 |
40 4 * * 1-5 | 每周一到周五的凌晨4點(diǎn)40分執(zhí)行命令 |
*/10 4 * * * | 每天的凌晨4點(diǎn),每個(gè)10分鐘執(zhí)行一次命令 |
0 0 1,15 * 1 | 每月1號(hào)和15號(hào)芬探,每周一的0點(diǎn)0分執(zhí)行命令齿尽,注意:星期幾和幾號(hào)最好不要同時(shí)出現(xiàn),因?yàn)樗麄兌x的都是天灯节,非常容易讓管理員混亂 |