天天看點

shell腳本程式設計初級篇

                                                         shell腳本程式設計初級篇

--------------------------------------------------------------------------------------------------------------------------------

程式腳本基本概念

程式:算法+資料結構

資料:程式的核心

算法:處理資料的方式

程式程式設計風格

過程式:以指令為中心,資料服務于指令

對象式:以資料為中心,指令服務于資料

進階程式設計語言

編譯:進階語言→編譯器→機器代碼→執行,例如c,c++等

解釋:進階語言→執行→解釋器→機器代碼,例如shell,python,php,javascript,perl等

程式設計邏輯處理方式

順序執行、循環執行、選擇執行

Shell腳本:包含一些指令或者聲明,并符合一定格式的文本檔案

格式要求:#!/bin/bash(或者其他類型的shell檔案,根據使用的shell類型進行選擇)

Shell腳本用途

自動化常用指令

執行系統管理和故障排除

建立簡單的應用程式

處理文本或檔案

編寫完一個腳本後,使用chmoda+x給其執行權限,然後将腳本放入bash檔案夾内或者更改$PATH或者輸入絕對/相對路徑來執行,寫的腳本屬于外部指令

變量

強類型:變量不經過強制轉換,它永遠是這個資料類型,不允許隐式的類型轉換。一般定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會産生錯誤

如java,c#

弱類型:語言的運作時會隐式做資料類型轉換。無須指定類型,預設均為字元型;參與運算會自動進行隐式類型轉換;變量無須事先定義可直接調用如:bash不支援浮點數,php

變量命名法則:

1、不能使程式中的保留字:例如if,for

2、隻能使用數字、字母及下劃線,且不能以數字開頭

3、見名知義

4、統一命名規則:駝峰命名法,例如小駝峰:studentName,大駝峰StudentName

局部變量:變量隻能在目前程序使用,不可以給父程序或者子程序使用,name=“a”

環境變量:全局變量,生效範圍為其自身和其子程序,不能給父程序使用,exportname=”a”

本地變量:生效範圍為目前shell程序中某代碼片斷,通常指函數

位置變量:$1,$2,...來表示,用于讓腳本在腳本代碼中調用通過指令行傳遞給它的參數

特殊變量:$?,$0,$*,$@,$#,$$

$?判斷前一個指令成功還是失敗,沒有特别指定下,0為成功,1-255為失敗

$0腳本名

$*所有參數,參數是一個獨立的整體

$@所有參數,參數是獨立的個體

$#參數個數

$數字第數字個參數

$@$*隻在被雙引号包起來的時候才會有差異

Shift:shift鍵1次後,第一個參數将沒有,之前第二個參數變為第一個參數,第n個參數變為第n-1個參數

$$檢視指令目前程序

$PPID檢視目前程序的父程序

啟用指令source、.和bash之間的差別

Source/.運作腳本不開啟子程序,會影響變量,而bash開啟子程序,不會影響變量,所有一般使用bash激活腳本,除非裝置需要變化環境變量才會使用./source

變量指派

變量指派:name=‘value’,可以使用引用value:

(1)可以是直接字串;name=“root"

(2)變量引用:name="$USER"

(3)指令引用:name=`COMMAND`name=$(COMMAND)

變量引用:${name}$name

"":弱引用,其中的變量引用會被替換為變量值

'':強引用,其中的變量引用不會被替換為變量值,而保持原字元串

顯示已定義的所有變量:set

删除變量:unsetname

顯示所有環境變量:

env

printenv

export

declare-x

隻讀變量:隻能聲明,但不能修改和删除

聲明隻讀變量:

readonlyname

declare-rname

檢視隻讀變量:readonly–p

位置變量:在腳本代碼中調用通過指令行傳遞給腳本的參數

set--清空所有位置變量

算術運算

bash中的算術運算:helplet

+,-,*,/,%取模(取餘),**(乘方)

實作算術運算:

(1)letvar=算術表達式

(2)var=$[算術表達式]

(3)var=$((算術表達式))

(4)var=$(exprarg1arg2arg3...)

(5)declare–ivar=數值

(6)echo‘算術表達式’|bc

乘法符号有些場景中需要轉義,如*

bash有内建的随機數生成器:$RANDOM(0-32767)

echo$[$RANDOM%50]:0-49之間随機數

指派

增強型指派:

+=,-=,*=,/=,%=

letvarOPERvalue

例如:letcount+=3

自加3後自指派

自增,自減:

letvar+=1

letvar++

letvar-=1

letvar—

邏輯運算

true, false

1, 0

與:

1 與 1 = 1

1 與 0 = 0

0 與 1 = 0

0 與 0 = 0

或:

1 或 1 = 1

1 或 0 = 1

0 或 1 = 1

0 或 0 = 0

非:!

! 1 = 0

! 0 = 1

短路運算

短路與

第一個為0,結果必定為0

第一個為1,第二個必須要參與運算

短路或

第一個為1,結果必定為1

第一個為0,第二個必須要參與運算

異或:^

異或的兩個值,相同為假,不同為真

條件測試

判斷某需求是否滿足,需要由測試機制來實作

專用的測試表達式需要由測試指令輔助完成測試過程

評估布爾聲明,以便用在條件性執行中

若真,則傳回0

若假,則傳回1

測試指令:test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]]

注意:EXPRESSION前後必須有空白字元

根據退出狀态而定,指令可以有條件地運作,&& 代表條件性的AND THEN,|| 代表條件性的OR ELSE

測試指令

test指令

長格式的例子:

test "$A" = "$B" && echo "Strings are equal"

test “$A”-eq “$B” && echo "Integers are equal"

簡寫格式的例子:

[ "$A" = "$B" ] && echo "Strings are equal"

[ "$A" -eq "$B" ] && echo "Integers are equal"

bash的數值測試

-v VAR

變量VAR是否設定

數值測試:

-gt 是否大于

-ge 是否大于等于

-eq 是否等于

-ne 是否不等于

-lt 是否小于

-le 是否小于等于

bash的字元串測試

字元串測試:

= 是否等于

> ascii碼是否大于ascii碼

< 是否小于

!= 是否不等于

=~ 左側字元串是否能夠被右側的PATTERN所比對

注意: 此表達式一般用于[[ ]]中;擴充的正規表達式

-z "STRING“ 字元串是否為空,空為真,不空為假

-n "STRING“ 字元串是否不空,不空為真,空為假

 注意:用于字元串比較時的用到的操作數都應該使用引号

Bash的檔案測試

存在性測試

-a FILE:同-e

-e FILE: 檔案存在性測試,存在為真,否則為假

存在性及類别測試

-b FILE:是否存在且為塊裝置檔案

-c FILE:是否存在且為字元裝置檔案

-d FILE:是否存在且為目錄檔案

-f FILE:是否存在且為普通檔案

-h FILE 或 -L FILE:存在且為符号連結檔案

-p FILE:是否存在且為命名管道檔案

-S FILE:是否存在且為套接字檔案

檔案權限測試:

-r FILE:是否存在且可讀

-w FILE: 是否存在且可寫

-x FILE: 是否存在且可執行

檔案特殊權限測試:

-u FILE:是否存在且擁有suid權限

-g FILE:是否存在且擁有sgid權限

-k FILE:是否存在且擁有sticky權限

檔案大小測試:

-s FILE: 是否存在且非空

檔案是否打開:

-t fd: fd 檔案描述符是否在某終端已經打開

-N FILE:檔案自從上一次被讀取之後是否被修改過

-O FILE:目前有效使用者是否為檔案屬主

-G FILE:目前有效使用者是否為檔案屬組

雙目測試:

FILE1 -ef FILE2: FILE1是否是FILE2的硬連結

FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)

FILE1 -ot FILE2: FILE1是否舊于FILE2

Bash的組合測試條件

第一種方式:

COMMAND1 && COMMAND2 并且

COMMAND1 || COMMAND2 或者

! COMMAND 非

如:[[ -r FILE ]] && [[ -w FILE ]]

第二種方式:

EXPRESSION1 -a EXPRESSION2 并且

EXPRESSION1 -o EXPRESSION2 或者

! EXPRESSION

必須使用測試指令進行

使用read來把輸入值配置設定給一個或多個shell變量

-p 指定要顯示的提示

-s 靜默輸入,一般用于密碼

-n N 指定輸入的字元長度N

-d ‘字元’ 輸入結束符

-t N TIMEOUT為N秒

read 從标準輸入中讀取值,給每個單詞配置設定一個變量

所有剩餘單詞都被配置設定給最後一個變量

read -p “Enter a filename: “ FILE

把指令行分成單個指令詞

展開别名

展開大括号的聲明({})

展開波浪符聲明(~)

指令替換$() 和 ``)

再次把指令行分成指令詞

展開檔案通配(*、?、[abc]等等)

準備I/0重導向(<、>)

運作指令

防止擴充

反斜線(\)會使随後的字元按原意解釋

$ echo Your cost: \$5.00

Your cost: $5.00

加引号來防止擴充

單引号(’)防止所有擴充

雙引号(”)也防止所有擴充,但是以下情況例外:

$(美元符号) - 變量擴充

`(反引号) - 指令替換

\(反斜線) - 禁止單個字元擴充

!(歎号) - 曆史指令替換

bash的配置檔案

按生效範圍劃分,存在兩類:

全局配置:

/etc/profile

/etc/profile.d/*.sh

/etc/bashrc

個人配置:

~/.bash_profile

~/.bashrc

shell登入兩種方式

互動式登入:

(1)直接通過終端輸入賬号密碼登入

(2)使用“su - UserName” 切換的使用者

執行順序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非互動式登入:

(1)su UserName

(2)圖形界面下打開的終端

(3)執行腳本

(4)任何其它的bash執行個體

執行順序: ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

Profile類

按功能劃分,存在兩類:

profile類和bashrc類

profile類:為互動式登入的shell提供配置

全局:/etc/profile, /etc/profile.d/*.sh

個人:~/.bash_profile

功用:

(1) 用于定義環境變量

(2) 運作指令或腳本

Bashrc類

bashrc類:為非互動式和互動式登入的shell提供配置

全局:/etc/bashrc

個人:~/.bashrc

(1) 定義指令别名和函數

(2) 定義本地變量

編輯配置檔案生效

修改profile和bashrc檔案後需生效

兩種方法:

1重新啟動shell程序

2 . 或source

Bash 退出任務

儲存在~/.bash_logout檔案中(使用者)

在登出shell時運作

用于

建立自動備份

清除臨時檔案

$-變量

h:hashall,打開這個選項後,Shell 會将指令所在的路徑hash下來,避免每次都要查詢。通過set +h将h選項關閉

i:interactive-comments,包含這個選項說明目前的 shell 是一個互動式的 shell。所謂的互動式shell,在腳本中,i選項是關閉的。

m:monitor,打開監控模式,就可以通過Job control來控制程序的停止、繼續,背景或者前台執行等。

B:braceexpand,大括号擴充

H:history,H選項打開,可以展開曆史清單中的指令,可以通過!感歎号來完成,例如“!!”傳回上最近的一個曆史指令,“!n”傳回第 n 個曆史指令

繼續閱讀