1、什么是shell魁袜?
Shell其實(shí)是一個(gè)命令解釋器,作用是解釋執(zhí)行用戶輸入的命令以及程序等敦第,用戶每輸入一條命令峰弹,Shell給予解釋執(zhí)行一條。這種鍵盤一輸入命令申尼,就可以立即得到回應(yīng)的對(duì)話方式垮卓,稱為交互模式。
Shell存在于操作系統(tǒng)的最外層师幕,負(fù)責(zé)與用戶直接對(duì)話粟按。處理用戶的輸入,并將操作系統(tǒng)執(zhí)行結(jié)果返回給用戶霹粥。在用戶登陸到操作系統(tǒng)之后的所有操作均由Shell解釋執(zhí)行灭将。Shell在操作系統(tǒng)中所處的位置如下
1.2 什么是shell腳本?
簡言之后控,如果shell命令通過寫入到一個(gè)程序文件并執(zhí)行的時(shí)候庙曙,此程序我們就稱之為shell腳本(即:由命令組合成的一個(gè)可執(zhí)行的文件)。但是在生產(chǎn)環(huán)境中的Shell腳本不僅僅是這么簡單浩淘,而是將一些命令捌朴、變量以及流程控制語句有機(jī)結(jié)合并生成的功能完善的強(qiáng)大的應(yīng)用程序。舉例說明:
清除/var/log下message日志文件簡單腳本
cat /dev/null > /var/log/messages
reboot
生產(chǎn)環(huán)境中清除/var/log下message的腳本
#!/bin/bash
# 清除日志腳本张抄,版本 2
LOG_DIR=/var/log
# 腳本需要使用root用戶權(quán)限來執(zhí)行砂蔽,因此,對(duì)當(dāng)前用戶進(jìn)行判斷署惯,則不和要求的用戶給出友好提示左驾,并終止程序執(zhí)行
ROOT_UID=0
if [ "$UID" -ne "$ROOT_UID" ] # <== 如果當(dāng)前用戶不是root外厂,則不允許執(zhí)行腳本
then
echo "Must be root to run this script." # <== 給出提示后退出
exit 1
fi
# 如果切換目錄不成功呵晨,則給出提示并中止程序執(zhí)行
cd $LOG_DIR || {
echo "Cannot change to necessary directory."
exit 1
}
# 經(jīng)過上述判斷之后,此處的用戶權(quán)限應(yīng)該是對(duì)的了驾荣,只有清空成功轻猖,再能打印成功提示
cat /dev/null >messages &&{
echo "Logs cleaned up."
exit 0 # 返回0則成功
}
echo "Logs cleaned up fail."
exit 1 # 返回1則失敗
1.3 什么時(shí)候使用shell腳本帆吻?
1>Linux批量管理
2>自動(dòng)化完成系統(tǒng)優(yōu)化
3>自動(dòng)化安裝Linux操作系統(tǒng)(kickstart和cobbler)
4>測試工具和內(nèi)容自動(dòng)化
5>郵件自動(dòng)發(fā)送
6>服務(wù)自動(dòng)重啟
7>代碼上線
8>定時(shí)備份和定時(shí)啟停服務(wù)
9>Linux系統(tǒng)監(jiān)控、服務(wù)監(jiān)控咙边、端口監(jiān)控桅锄、IP黑名單監(jiān)控琉雳、流量監(jiān)控(腳本+zabbix)
10>服務(wù)的日志切割、存儲(chǔ)備份友瘤、日志分析等等
1.4 如何學(xué)好shell腳本翠肘?
1>基礎(chǔ)變量、條件表達(dá)式辫秧、流程判斷束倍、if、for循環(huán)盟戏、while循環(huán)绪妹、case語句、循環(huán)控制
2>從簡單的判斷和循環(huán)開始寫
3>閱讀柿究、模仿邮旷、嘗試從零開始寫
4>寫注釋,將任務(wù)分解成一個(gè)個(gè)小任務(wù)蝇摸,類似于打游戲闖關(guān)
5>找一本合適的教材婶肩,或者自己認(rèn)真記筆記
6>多練習(xí)-思考-練習(xí)-思考,循環(huán)往復(fù)
1.5 解釋型語言和編譯型語言
1.5.1 編譯型語言:
指用專用的編譯器貌夕,針對(duì)特定的操作平臺(tái)(操作系統(tǒng))將某種高級(jí)語言源代碼一次性翻譯成可被硬件平臺(tái)直接運(yùn)行的二進(jìn)制機(jī)器碼律歼,這個(gè)過程叫做編譯。
編譯好的可執(zhí)行文件(.exe)啡专,可在相對(duì)應(yīng)的平臺(tái)運(yùn)行(移植性差险毁,但是效率高)。
C\C++.....
1.5.2 解釋型語言:
用專門解釋器對(duì)源程序逐行解釋成特定平臺(tái)的機(jī)器碼并立即執(zhí)行的語言们童,相當(dāng)于把編譯型語言的編譯執(zhí)行過程混合在一起同時(shí)完成的畔况。
編譯型語言執(zhí)行效率較低,切不能脫離解釋器運(yùn)行慧库。但是跨平臺(tái)比較容易问窃,只需提供相應(yīng)的解釋器
shell\python
注:Java屬于特殊的。既可以說成是解釋型語言完沪,又可以說成是編譯型語言
1.6 shell腳本建立和執(zhí)行
1.6.1 解釋器類型
sh、bash是centos中的默認(rèn)解釋器
1.6.2 腳本定義
腳本開頭
#!/bin/bash
1.6.3 父shell和子shell
腳本嵌套
父shell中的環(huán)境變量嵌戈,在子shell中可以看到
而子shell中的變量覆积,在父shell中看不到
1.6.4 shell執(zhí)行方式
1>sh & bash,最常用的使用方式
2>cat .sh | bash熟呛,適用于執(zhí)行多個(gè)腳本
3>sh < oldboy.sh宽档,了解一下,輸入重定向
4>/root/oldboy.sh庵朝,需要執(zhí)行權(quán)限
5>. oldboy.sh*
6>source oldboy.sh
1.6.5 shell開發(fā)習(xí)慣
1>腳本存放在固定目錄
2>開頭加腳本解釋器信息
3>附帶作者和版權(quán)信息
4>腳本中盡量不用中文
5>腳本擴(kuò)展名用.sh
6>成對(duì)的符號(hào)一次性書寫完成
7>注意縮進(jìn)
8>養(yǎng)成寫注釋的良好習(xí)慣
總結(jié):
1>腳本放在指定目錄
2>創(chuàng)建腳本吗冤,后綴是.sh
3>在第一行頂格添加命令解釋器的聲明#!/bin/bash
4>添加作者時(shí)間和版權(quán)信息
5>養(yǎng)成良好習(xí)慣又厉,添加注釋
6>Centos7默認(rèn)解釋器是/bin/bash
7>退出當(dāng)前shell的命令是:exit
8>在使用history的時(shí)候,加入腳本中椎瘟,執(zhí)行什么也不會(huì)輸出覆致,在9>腳本中加入set -o history即可解決,但是默認(rèn)顯示的是這個(gè)腳本里的歷史命令肺蔚。但是如果還想顯示腳本外的歷史記錄煌妈,可以使用source 執(zhí)行腳本。