第一章 如何才能學(xué)號(hào)Shell編程
學(xué)好Shell編程所需的基礎(chǔ)知識(shí):
(1) 熟練使用vim編輯器。
(2) 要有一定的Linux命令基礎(chǔ),120個(gè)常用命令以上。
(3) 熟練掌握Linux正則表達(dá)式以及三劍客命令。
如何能學(xué)號(hào)Shell編程之“老鳥(niǎo)”經(jīng)驗(yàn)談:
(1) 掌握Shell腳本基本語(yǔ)法的方法
(2) 掌握Shell腳本的各種常見(jiàn)語(yǔ)法。
(3) 形成自己的腳本開(kāi)發(fā)風(fēng)格。
(4) 從簡(jiǎn)單做起,簡(jiǎn)單判斷,簡(jiǎn)單循環(huán)。
(5) 多模仿,多放下參考資料練習(xí),多思考。
(6) 學(xué)會(huì)分析問(wèn)題,逐漸形成編程思維。
(7) 編程變量名字要規(guī)范,采用駝峰語(yǔ)法表示。
(8) 不要拿來(lái)主義,特別是新手。
第二章 Shell腳本初步入門
1、 什么是Shell?
Shell是一個(gè)命令解釋器,作用是解釋執(zhí)行用戶輸入的命令以及程序,用戶每輸入一條Shell就解釋執(zhí)行一條。
2、 什么是Shell腳本?
當(dāng)命令或程序語(yǔ)句不在命令行下執(zhí)行,而是通過(guò)一個(gè)程序文件來(lái)執(zhí)行時(shí),該程序就被稱為Shell腳本。用戶可以在Shell腳本中敲入一系列的命令及命令語(yǔ)句組合。這些命令、變量和流程控制語(yǔ)句等有機(jī)地結(jié)合起來(lái),就形成了一個(gè)功能強(qiáng)大的Shell腳本。
P8案例2-3
第一關(guān),必須是root才能執(zhí)行腳本,否則給出友好提示并終止腳本運(yùn)行。
第二關(guān),成功切換目錄,否則給出友好提示并終止腳本運(yùn)行。
第三關(guān),清理日志,如清理成功,則給出正確提示。
第四關(guān),通關(guān)或失敗,分別給出相應(yīng)的提示。
2.1 Shell腳本在Linux運(yùn)維工作中的地位:
Shell腳本語(yǔ)言很適合用于處理純文本類型的數(shù)據(jù)。
2.2 腳本語(yǔ)言的種類:
Shell腳本語(yǔ)言是弱類型語(yǔ)言(無(wú)需定義變量的類型即可使用)。
(1) Bounrne shell
Bourne shell又包括Bourne shell(sh)、Korn shell(ksh)、Bounrne Again Shell (bash)。
(2) C shell
C shell又包括csh、tcsh兩種類型。
Linux系統(tǒng)中的主流Shell是bash。
2.3 其他常用的腳本語(yǔ)言種類:
(1)PHP語(yǔ)言。
(2)Perl語(yǔ)言
(3)Python語(yǔ)言
2.4 Shell腳本語(yǔ)言優(yōu)勢(shì):
Shell腳本語(yǔ)言的優(yōu)勢(shì)在于處理偏操作系統(tǒng)底層的業(yè)務(wù)。使用Shell開(kāi)發(fā)會(huì)更簡(jiǎn)單、更快捷。例如:讓軟件一鍵自動(dòng)化安裝、優(yōu)化,監(jiān)控報(bào)警腳本,軟件啟動(dòng)腳本,日志分析腳本等。使用Shell更符合Linux運(yùn)維簡(jiǎn)單、易用、高效的三大基本原則。
PHP語(yǔ)言的優(yōu)勢(shì)在于小型網(wǎng)站系統(tǒng)的開(kāi)發(fā),只能應(yīng)用于網(wǎng)頁(yè)。
Python語(yǔ)言的優(yōu)勢(shì)在于開(kāi)發(fā)較復(fù)雜的運(yùn)維工具軟件。
Java適用于中大型網(wǎng)站開(kāi)發(fā)。
書(shū)寫(xiě)規(guī)范:
1、腳本里加#!/bin/bash
2、bash a.sh
3、. /a.sh 默認(rèn)也是bash。Linux默認(rèn)就是bash。
bash和sh的區(qū)別:
CentOS7:sh是bash的軟鏈接。
bash –version #查看bash版本。
Shell腳本的基本執(zhí)行流程:
執(zhí)行腳本的5種方法
方式1:不需要執(zhí)行權(quán)限
[root@web01 ~]# sh oldboy.sh #推薦
I am oldboy
[root@web01 ~]# bash oldboy.sh
I am oldboy
方法2:
[root@web01 ~]# cat oldboy.sh|bash
I am oldboy
方法3:輸入重定向
[root@web01 ~]# sh <oldboy.sh
I am oldboy
方法4:執(zhí)行權(quán)限
[root@web01 ~]# /root/oldboy.sh
-bash: /root/oldboy.sh: 權(quán)限不夠
[root@web01 ~]#
[root@web01 ~]#
[root@web01 ~]# chmod +x /root/oldboy.sh
[root@web01 ~]# /root/oldboy.sh
I am oldboy
方法5:
[root@web01 ~]# . /root/oldboy.sh
I am oldboy
[root@web01 ~]# source /root/oldboy.sh
I am oldboy
結(jié)論:通過(guò)source或”.”加載執(zhí)行過(guò)的腳本,由于是在當(dāng)前Shell中執(zhí)行腳本,因此在腳本結(jié)束之后,腳本中的變量(包括函數(shù))值在當(dāng)前Shell中依然存在,而sh和bash執(zhí)行腳本都會(huì)啟動(dòng)新的子Shell執(zhí)行,執(zhí)行完后退回到Shell。因此,變量(包括函數(shù))值無(wú)法保留。在進(jìn)行Shell腳本開(kāi)發(fā)時(shí),如果腳本中有引用或執(zhí)行其他腳本的內(nèi)容或配置文件的需求時(shí),最好用”.” 或source先加載該腳本或配置文件,處理完之后,再將他們加載到腳本的下面,就可以調(diào)用source加載的腳本及配置文件中的變量及函數(shù)等內(nèi)容了。
P18范例2-5
結(jié)論:
(1)兒子Shell腳本會(huì)直接繼承父親Shell腳本的變量、函數(shù)(就好像是兒子隨父親姓,基因也會(huì)繼承父親的)等,反之則不可以。
(2)如果希望反過(guò)來(lái)繼承(就好像是讓父親隨兒子姓,讓父親的基因也繼承兒子的,)就要用source或”.”在父親Shell腳本中事先加載兒子的Shell腳本。
Shell腳本開(kāi)發(fā)的基本規(guī)范及習(xí)慣
(1) Shell腳本的第一行是指定腳本解釋器。
(2) Shell腳本的開(kāi)頭會(huì)加版本、版權(quán)等信息。
(3) 在Shell腳本中盡量不用中文(不限于注釋)。
(4) Shell腳本的命名應(yīng)以.sh為擴(kuò)展名。
(5) Shell腳本應(yīng)存放在固定的路徑下.
第三章 Shell變量的核心基礎(chǔ)知識(shí)與實(shí)踐
什么是Shell變量?
變量就是用一個(gè)固定的字符串(也可能是字符、數(shù)字等的組合)代替更多、更復(fù)雜的內(nèi)容,該內(nèi)容里可能還會(huì)包含變量、路徑、字符串等其他的內(nèi)容。
變量類型:
(1) 環(huán)境變量(全局變量):可以創(chuàng)建它們的Shell及其派生出來(lái)的任意子進(jìn)程Shell中使用,環(huán)境變量又可分為自定義環(huán)境變量和bash內(nèi)置的環(huán)境變量。
(2) 普通變量(局部變量):只能在創(chuàng)建它們的Shell函數(shù)或Shell腳本中使用。普通變量一般由開(kāi)發(fā)者在開(kāi)發(fā)腳本程序時(shí)創(chuàng)建。
環(huán)境變量:
環(huán)境變量一般是指export內(nèi)置命令導(dǎo)出的變量,用于定義Shell的運(yùn)行環(huán)境,保證Shell命令的正確執(zhí)行。Shell通過(guò)環(huán)境變量來(lái)確定登錄用戶名、命令路徑、終端類型、登錄目錄等。
因?yàn)橄到y(tǒng)需要,自身存在的變量。
按照規(guī)范,所有環(huán)境變量名字均采用大寫(xiě)形式。
自定義環(huán)境變量
定義方法1:
[root@web01 ~]# export OLDBOY=1
[root@web01 ~]# echo $OLDBOY
1
定義方法2:
[root@web01 ~]# OLDGIRL=2
[root@web01 ~]# export OLDGIRL
[root@web01 ~]# echo $OLDGIRL
2
定義方法3:
-x to make NAMEs export
[root@web01 ~]# declare -x OLD=3
[root@web01 ~]# echo $OLD
3
環(huán)境變量永久生效
(1)/etc/profile
(2)~/.bash_profile
(3)~/.bashrc
(4)/etc/bashrc
# 優(yōu)先順序(4)到(1)
環(huán)境變量的知識(shí)小結(jié):
(1) 變量名通常要大寫(xiě)。
(2) 變量可以在自身的Shell及子Shell中使用。
(3) 常用的export來(lái)定義環(huán)境變量。
(4) 執(zhí)行env默認(rèn)可以顯示所有的環(huán)境變量名稱及對(duì)應(yīng)的值。
(5) 輸出環(huán)境變量時(shí)用“$變量名”,取消環(huán)境變量時(shí)用“unset變量名”。
(6) 書(shū)寫(xiě)crond定時(shí)任務(wù)時(shí)要注意,腳本要用到的環(huán)境變量最好現(xiàn)在所執(zhí)行的Shell腳本中重新定義。
(7) 如果希望環(huán)境變量永久生效,則可以將其放在用戶環(huán)境變量文件或全局環(huán)境變量文件里。
環(huán)境變量初始化與對(duì)應(yīng)文件的生效順序:
系統(tǒng)運(yùn)行Shell的方式一般有3種:
(1) 通過(guò)系統(tǒng)用戶登錄后默認(rèn)運(yùn)行的Shell。
(2) 非登錄交互式運(yùn)行Shell。
(3) 執(zhí)行腳本運(yùn)行非交互式Shell。
如果用戶的Shell不是登錄時(shí)啟動(dòng)的,就需要將變量設(shè)定等寫(xiě)入$HOME/.bashrc或者/etc/bashrc。
普通變量賦值一般有三種寫(xiě)法:不加引號(hào),加單引號(hào),加雙引號(hào)。
在Shell中定義變量名以及為變量?jī)?nèi)容賦值的要求:
變量名一般是由字母、數(shù)字、下劃線組成的,可以以字母或下劃線開(kāi)頭,但不能是數(shù)字開(kāi)頭。
局部(普通)變量定義及賦值的經(jīng)驗(yàn)小結(jié):
(1) 若變量?jī)?nèi)容為連續(xù)的數(shù)字或字符串,賦值時(shí),變量?jī)?nèi)容兩邊可以不加引號(hào)。
(2) 變量的內(nèi)容很多時(shí),如果有空格且希望解析內(nèi)容中的變量,就加雙引號(hào)。
(3) 希望原樣輸出變量中的內(nèi)容時(shí)就用單引號(hào)引起內(nèi)容進(jìn)行賦值。
(4) 要使用反引號(hào)將賦值的命令括起來(lái)。
老男孩建議:
(1) 在腳本中定義普通字符串變量時(shí),應(yīng)盡量把變量的內(nèi)容用雙引號(hào)括起來(lái)。
(2) 單純數(shù)字的變量?jī)?nèi)容可以不加引號(hào)。
(3) 希望變量的內(nèi)容原樣輸出時(shí)需要加單引號(hào)。
(4) 希望變量值引用命令并獲取命令的結(jié)果時(shí)就用反引號(hào)或$()。
一、變量名及變量?jī)?nèi)容定義小結(jié)
(1) 變量名只能為字母、數(shù)字或下劃線,只能以字母或下劃線開(kāi)頭。
(2) 變量名的定義要有一定的規(guī)范,并且要見(jiàn)名知意。
(3) 一般的變量定義、賦值常用雙引號(hào),簡(jiǎn)單連續(xù)的字符串可以不加引號(hào),希望原樣輸出時(shí)使用單引號(hào)。
(4) 希望變量的內(nèi)容時(shí)命令的解析結(jié)果時(shí),要用反引號(hào)``,或者用$()把命令括起來(lái)再賦值。
二、Shell定義變量時(shí)使用“=”的知識(shí)。
三、打印輸出及使用變量的知識(shí)
(1) 打印輸出或使用變量時(shí),變量名前要接
,這個(gè)有些例外。
(2) 打印輸出或使用變量時(shí),一般加雙引號(hào)或不加引號(hào),如果是字符串變量,最好加雙引號(hào),希望原樣輸出時(shí)使用單引號(hào)。
[root@webol ~]# oldboy="I am oldboy"
[root@webol ~]# echo $oldboy
I am oldboy
1、 變量名
變量名組成、定義規(guī)范
2####、 等號(hào)
賦值符,兩邊不能有空格
3、 變量?jī)?nèi)容
單引號(hào)、雙引號(hào)、反引號(hào)、不加引號(hào)
4、 輸出變量?jī)?nèi)容
變量名加$符號(hào),如果變量后面有內(nèi)容,用{}引用變量部分。
單引號(hào)、雙引號(hào)、反引號(hào)、不加引號(hào)
用echo或者printf