Shell腳本編程基礎(chǔ)

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的都是天灯节,非常容易讓管理員混亂
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末循头,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炎疆,更是在濱河造成了極大的恐慌卡骂,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件形入,死亡現(xiàn)場(chǎng)離奇詭異全跨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亿遂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門浓若,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渺杉,“玉大人,你說我怎么就攤上這事挪钓∈窃剑” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵碌上,是天一觀的道長(zhǎng)倚评。 經(jīng)常有香客問我,道長(zhǎng)馏予,這世上最難降的妖魔是什么天梧? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮霞丧,結(jié)果婚禮上呢岗,老公的妹妹穿的比我還像新娘。我一直安慰自己蛹尝,他們只是感情好敷燎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著箩言,像睡著了一般硬贯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陨收,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天饭豹,我揣著相機(jī)與錄音,去河邊找鬼务漩。 笑死拄衰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饵骨。 我是一名探鬼主播翘悉,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼居触!你這毒婦竟也來了妖混?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤轮洋,失蹤者是張志新(化名)和其女友劉穎制市,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弊予,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祥楣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片误褪。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡责鳍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兽间,到底是詐尸還是另有隱情历葛,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布渡八,位于F島的核電站啃洋,受9級(jí)特大地震影響传货,放射性物質(zhì)發(fā)生泄漏屎鳍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一问裕、第九天 我趴在偏房一處隱蔽的房頂上張望逮壁。 院中可真熱鬧,春花似錦粮宛、人聲如沸窥淆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忧饭。三九已至,卻和暖如春筷畦,著一層夾襖步出監(jiān)牢的瞬間词裤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工鳖宾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吼砂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓鼎文,卻偏偏與公主長(zhǎng)得像渔肩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拇惋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359