shell腳本編程基礎(1)

要想玩轉Linux系統,編寫shell腳本是必須要掌握的技能。那什么是shell編程呢?簡單來說,shell編程就是對多個Linux命令進行邏輯處理。

本節索引

一、編程基礎

二、腳本基本格式

三、變量

四、條件測試

五、配置用戶環境

 

要想玩轉Linux系統,編寫shell腳本是必須要掌握的技能。那什么是shell編程呢?簡單來說,shell編程就是對多個Linux命令進行邏輯處理。

下面,我們從編程的基礎開始講起:

timg_image&quality=80&size=b9999_10000&sec=1523364020366&di=4d83295488832abeb6fb

 

一、編程基礎

1.什么是程序?

程序是指:指令+數據

程序編程風格可分為:

過程式:以指令為中心,數據服務于指令(關注過程,小軟件開發)

對象式:以數據為中心,指令服務于數據(關注結果,適合開發大型軟件)

 

2.程序的執行方式

計算機:運行二進制命令

編程語言:

低級:匯編

高級:

編譯:高級語言–>編譯器–>目標代碼 (由程序員完成編譯器翻譯過程,安全性相對好)

java,C#

解釋:高級語言–>解釋器–>機器代碼 (由電腦完成解釋器翻譯過程,安全性不如編譯型)

shell,perl,python

 

shell程序:提供了編程能力,解釋執行

 

 

3.編程基本概念

編程邏輯處理方式:

順序執行

循環執行

選擇執行

 

shell編程:過程式、解釋執行

編程語言的基本結構:

各種系統命令的組合

數據存儲:變量、數組

表達式:a+b

語句:if

 

二、腳本基本格式

格式要求:

首行shebang機制(即聲明腳本使用哪種編程語言)

如:???????? #!/bin/bash

#!/bin/python

 

shell腳本的用途有:

自動化常用命令

執行系統管理和故障排除

創建簡單的應用程序

處理文本或文件

 

運行腳本:

1.給予執行權限,執行

2.直接運行解釋器,將腳本作為解釋器程序的參數運行

 

腳本規范:

腳本代碼開頭約定:

1.第一行一般為調用使用的語言

2.程序名,避免更改文件名為無法找到正確的文件

3.版本號

4.更改后的時間

5.作者相關信息

6.該程序的作用,及注意事項

7.最后是各版本的更新簡要說明

 

腳本示例:

#!/bin/bash

# ——————————————

# Filename:??? hello.sh # Revision:??? 1.1

# Date:??????? 2018/04/01

# Author:????? wangx

# Email:?????? wangx@gmail.com

# Website:???? www.donlihuoguo.cn

# Description: This is the first script

# ——————————————

# Copyright:?? 2018 wang

# License:???? GPL? echo “hello world”

 

腳本調試:

bash -n script? 檢查腳本的語法錯誤

bash -x script? 調試腳本執行

 

三、變量

定義變量時,變量名不加$符號,如:

my_name=”wangx”

*變量命名規則:

1.數字、字母、下劃線,不能以數字開頭

2.不能使用程序中的保留字:如if,for等

3.做到見名知意

 

注意:

引用變量一般需加$

賦值變量:

name=” ”?? 要加引號

存放多行字符時”$name”變量外加雙引號可保留換行格式

 

*bash變量的種類

局部變量、全局變量、本地變量、位置變量、特殊變量

局部變量:只在當前shell進程生效,對當前shell之外其他shell進程,包括父shell和子shell都無效

全局變量:生效范圍在當前shell進程及其子進程;父進程變量可以傳給子進程,子進程變量不可向上傳給父進程

數字變量:$10以上的變量需要加花括號${10}

特殊變量:$1,$@,$*,$#,$0等、

$1,$2,…:對應第1、第2參數,shift[n]換位置

$0:命令本身

$*:傳遞給腳本的所有參數,每個參數合為一個字符串

$@:傳遞給腳本的所有參數,每個參數為獨立字符串

$#:傳遞給腳本的參數的個數

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

set–???????? 清空所有位置變量

 

注:怎么判斷變量前加不加$符號?

如果命令能識別變量就不加$,如果命令不能識別變量加$;

養成好習慣:編完腳本將變量用unset刪掉;

 

()中使用的命令為一次性的,小括號中相當于在子進程中執行命令

注:小括號中所說的子進程與常規的子進程不是一回事

例如:x=1;echo $$;(echo $$)中顯示進程號一致

 

{ ;}中使用命令時在當前shell環境中執行,不開啟子進程影響當前shell環境

 

*變量運算

bash中的算術運算:help let

+,-,*,/,%取余,**乘方

實現算術運算:

1.let var=算術表達式

2.var=$[算術表達式]

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

 

注:算術運算過程中,空格盡量刪除

條件測試過程中,能加空格地方盡量加空格

正則條件測試時,正則表達式不加引號

 

四、條件測試

 

測試命令:

test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]]??? 雙括號一般用于左側字符匹配右側擴展正則表達式

注:EXPRESSION前后必須有空白字符

 

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

若真,則返回0

若假,則返回1

 

例如:#a=1;b=2

#[ $a -eq $b ]

#echo $?

#1

#a=2;b=2

#[ $a -eq $b ]

#echo $?

#0

 

條件性的執行操作符

&&代表條件性的AND THEN,前面執行結果$?=0時,繼續執行&&后命令

||代表條件性的OR ELSE,前面執行結果$?不為0時,執行||后命令

 

test? 與[? ]效果相同,注意括號里內容兩邊需加空格

-v VAR????? 變量VAR是否設置

 

數值測試:

-gt??? 是否大于(greater-than)

-ge?? 是否大于等于(greater-than-or-equal)

-eq?? 是否等于(equal)

-ne?? 是否不等于(not-equal)

-lt???? 是否小于(less-than)

-le??? 是否小于等于(less-than-or-equal)

字符串測試:

==??? 是否等于

>?????? ascii碼是否大于ascii碼

<?????? 是否小于

!=???? 是否不等于

=~??? 左側字符串是否能夠被右側的PATTERN所匹配

注:使用PATTERN匹配時,需要加雙括號[[ ]];使用擴展的正則表達式,且正則表達式不能加引號

-z????? 字符串是否為空,空為真,不空為假

-n???? 字符串是否為不空,不空為真,空為假

注:用于字符串比較時的用到的操作應該都使用引號

字符串是否為空還可用[ “$name” == “” ]來測試。

文件相關測試:

存在性測試:

-a FILE???? 同-e

-e FILE 文件存在性測試,存在為真,否則為假

存在性及類別測試:

-b FILE 是否存在且為塊設備文件

-c FILE 是否存在且為字符設備文件

-d FILE 是否存在且為目錄文件

-f FILE 是否存在且為普通文件

-h FILE 同-L

-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 當前有效用戶是否文文件屬組

 

注意:文件測試后跟空字符時,也反饋為True,如果要保證一個文件存在且滿足測試條件時,

應表示為:例:[ -n “file” -a -d “file” ]

file文件是否存在且為目錄文件

 

雙目測試:

FILE1 -ef FILE2???????????????? FILE1是否是FILE2的硬鏈接

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

FILE1 -ot FILE2???????????????? FILE1是否舊于FILE2

 

*Bash的組合測試條件:

第一種方式:

COMMAND1 && COMMAND2????? 并且

COMMAND1 || COMMAND2??????? 或者

!COMMAND???????? 非

 

第二種方式:

[ EXPRESSION -a EXPRESSION ]???? 并且

[ EXPRESSION -o EXPRESSION ]???? 或者

[ !EXPRESSION ]????????? 非

注:優先級為:”!”最高,”-a”次之,”-o”最低

 

 

短路與&&

 

0&&0=0

0&&1=0

1&&0=0

1&&1=1

 

cmd1 && cmd2

如果cmd1為假,cmd2不需要執行,反之cmd1為真,需要cmd2執行

 

短路或||

 

0||0=0

0||1=1

1||0=1

1||1=1

 

cmd1 || cmd2

如果cmd1為真,cmd2不需要執行,反之cmd1為假,需要cmd2執行

 

異或 XOR ^

如果相同為假,反則為真

0 ^ 1 = 1

1 ^ 0 = 1

1 ^ 1 = 0

0 ^ 0 = 0

 

 

注意:[? ]和test用變量時,最好加雙引號””避免出問題

 

false || { echo cmd1 ; echo cmd2 ; }

false || (echo cmd1 ; echo cmd2)

 

*使用read命令來接受輸入

read???????? 使用read來把輸入值分配給一個或多個shell變量

-p???? 指定要顯示的提示

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

-n???? N指定輸入的字符長度N

-d???? ‘字符’輸入結束符,類型與輸入重定向的<<EOF

-t N? TIMEOUT為N秒,N秒內無輸入將自動退出

read命令從標準輸入中讀取單詞,并給每個單詞分配一個變量

例如:

read -p “Enter a filename:” FILE??? 標準輸入將賦予變量$FILE

read命令從標準輸入中讀取單詞,并給每個單詞分配一個變量

read 給多個變量賦值的方法:

(1)將多個變量輸入一個文件中,用空格分開,輸出重定向

read a b c < f

(2)用“>>>”分開:

read a b c <<< “x y z”

五、配置用戶環境

bash的配置文件

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

全局配置:

/etc/profile

/etc/profile.d/*.sh

/etc/bashrc

個人配置:

~/.profile

~/.bashrc

shell登錄的兩種方式:

交互式登錄:

1.直接輸入賬號密碼登錄

2.su – username 切換的用戶

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

非交互式的登錄:

1.su usernme

2.圖形界面打開的終端

3.執行腳本

4.任何其他的bash實例

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

注:只在交互式登錄生效:/etc/profile,~/.bash_profile

配置執行文件按功能劃分,存在兩類:

profile類和bashrc類

Profile類:為交互式登錄的shell提供配置

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

個人生效:~/.bash_profile

功用:

(1)用于定義環境變量

(2)運行命令或腳本

Bashrc類:為非交互式和交互式登錄的shell提供配置

全局生效:/etc/bashrc

個人生效:~/.bashrc

功用:

(1)定義命令別名和函數

(2)定義本地變量

修改profile和bashrc文件后使生效的兩種方法:

(1)重新啟動shell進程

(2).或sourc;例:.~/.bashrc

注意: .或source執行腳本表示將在當前進程運行,而不是開啟一個子進程運行(配置文件一般用此方式執行)

bash執行腳本則是開啟一個進程執行(運行腳本一般用此方式執行)

Bash退出任務

保存在~./.bash_logout文件中(用戶)

在退出登錄shell時運行

可用于:

創建自動備份

清除臨時文件

清除操作歷史等

特殊的變量$-

#echo $-

#hibBH

h:hash緩存功能;set -h,關閉hash功能;set +h,開啟hash功能

i:代表交互式shell

m:打開監控模式

B:大括號擴展

H:history,命令操作歷史

bash展開命令的優先級:

把命令行分成單個命令詞

展開別名

展開大括號{}

展開波浪符~

命令替換$()和“

再次把命令行分成命令詞

展開文件通配(*、?等)

I/O重定向

運行命令

 

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95644

(2)
wangxczwangxcz
上一篇 2018-04-10 15:27
下一篇 2018-04-10

相關推薦

  • MySQL

    mysql的增刪改查,備份恢復

    2018-06-18
  • 實現創建私有CA

    CA的構成:PKI: Public Key Infrastructure簽證機構:CA(Certificate Authority)注冊機構:RA證書吊銷列表:CRL證書存取庫:X.509:定義了證書的結構以及認證協議標準版本號序列號簽名算法頒發者有效期限主體名稱主體公鑰CRL分發點擴展信息發行者簽名證書類型:證書授權機構的證書服務器用戶證書獲取證書兩種方法…

    Linux筆記 2018-05-22
  • Linux系統網絡管理

    本機索引: 一、基本網絡配置 二、主機、網卡名稱管理 三、網卡別名 四、Bonding技術 五、實現網絡組 六、Linux網絡管理常用命令   一、基本網絡配置: 將Linux主機接入網絡,需要配置網絡相關設置 一般包括以下內容: 主機名 IP/netmask 路由:默認網關 DNS服務器: 主DNS服務器 次DNS服務器   網絡配置文…

    2018-05-03
  • 初學linux所遇到錯誤詳解與使用技巧

    適合小白新手,好懂易操作。

    2018-03-31
  • 第一周 筆記

    ../返回上一層 相對路徑絕對路徑 ? ?../../ ? 以根開始絕對路徑 不以根開始是相對路徑 alias 簡化特別長得命令和參數(別名) ?unalias去掉別名使用 .bashrc ? ?-a全取消 ls .bashrc 別名目錄文件 basename ? 查看主機名 ?(取最后的文件名) bc 計算器 ? obase=幾進制 ?進制轉換 clock…

    Linux筆記 2018-04-01
欧美性久久久久