1. 程式人生 > >shell腳本編程學習筆記-shell腳本編程基礎介紹

shell腳本編程學習筆記-shell腳本編程基礎介紹

linux shell

一. Shell腳本介紹及第一個規範shell腳本說明

1.1 shell腳本簡介

1.1.1 shell是什麽?

shell是一個命令解釋器它在操作系統的最外層負責直接與用戶對話把用戶的輸入解釋給操作系統並處理各種各樣的操作系統的輸入結果輸出到屏幕返回給用戶,這種對話可以是交互是的(從鍵盤輸入命令可以立即得到shell的回應)或非交互(腳本的方式)。

下圖中×××的部分就是shell處於操作系統的位置。

技術分享圖片

1.1.2什麽是shell腳本

當linux命令或語句不在命令行下執行(嚴格的說命令行執行的語句也是shell腳本),而是通過一個程序文件執行時改程序就被成為shell腳本或shell程序,shell程序很類似DOS系統下的批處理程序(擴展名 *.bat)嚴格的說命令行下執行的語句也是shell 如for循環。

範例1.清除/var/log下的messages日誌文件的簡單命令腳本

把所有命令放在一個文件裏堆積起來就形成了腳本,下面是最簡單的命令堆積起來的腳本,清空日誌腳本。

Cd /var/log
Cat /dev/null > messages
Echo “Logs cleaned up.”

拓展:清空日誌及文件內容的三種方法

[root@localhost ~]# echo >test.log 
[root@localhost ~]# >test.log 
[root@localhost ~]# cat /dev/null >test.log

應用場景:保留文件,清空內容。

二. Shell語言及種類介紹

1.1 腳本語言的種類

Shell腳本語言的種類

在UNIX和LINUX中主要有兩大類

(1)Bourne shell 包括(sh、ksh和 bash)

Bourne shell (sh)

Kor n shell (ksh)

Bourne Again shell(bash)

POSIX shell (sh)

(2)C shell 包括(csh和tcsh)

C shell (csh)

TENEC/TOPS C shell (tcsh)

Shell腳本是弱類型語言目前最常用的shell有標準的Bourne shell(sh)和C shell(csh).其中Bourne shell(sh)已經被bash shell取代。但是我們還是習慣稱之為sh。

在linux中可以在/etc/init.d/shells下查看系統支持的shell,前三個是比較常用的,最常用的是/bin/sh,在工作中執行腳本用/bin/sh搞不定的我們可以用第一個。/sbin/nologin表示登錄。

技術分享圖片

1.2 Shell與python|perl|php語言的區別和優勢

Shell的優勢在於處理操作系統底層的業務,因為有大量的系統命令做支撐。Python,php的優勢在於開發運維工具,web界面的管理工具以及web業務的開發等。

1.3 常用操作系統的默認shell

Linux是Bourne Again shell(bash)?查看方法echo $SHELL

技術分享圖片

Salaris和Free BSD 缺省的是Bourne shell(sh)

AIX下是korn shell(ksh)

HP-UX缺省的是POSIX Shell(sh)

三. Shell腳本的建立與執行

1.1 Shell腳本的建立

shell腳本通常在shell編輯器中完成推薦使用vim編輯器,腳本第一行會指出由哪個程序(解釋器)來執行腳本中的內容,通常會用#!/bin/bash或#!/bin/sh,如果不寫第一行就會用系統默認的shell解釋。

1.2 sh和bash的區別

用ls –l /bin/sh查看會發現sh為bash的軟連接

技術分享圖片

推薦使用標準的寫法#!/bin/bash, bash –version查看shell版本

技術分享圖片

1.3 bash漏洞(破殼漏洞)

漏洞是控制Linux計算機命令提示符的軟件中存在的漏洞。
bash是一個為GNU計劃編寫的Unix shell。它的名字是一系列縮寫:Bourne-Again SHell ,Bourne shell是一個早期的重要shell,由史蒂夫·伯恩在1978年前後編寫,並同Version 7 Unix一起發布。
網絡安全專家警告稱,開源軟件Linux中一個頻繁使用的片段“Bash”,發現存在安全漏洞,其對計算機用戶造成的威脅可能要超過2014年4月爆出的“心臟出血”(Heartbleed)漏洞。以上來自官方,大家可以在百度搜索“破殼漏洞”查看,下面為查看地址.

https://baike.baidu.com/item/bash%E6%BC%8F%E6%B4%9E/15843234?fr=aladdin&fromid=15848205&fromtitle=%E7%A0%B4%E5%A3%B3%E6%BC%8F%E6%B4%9E

1.4 shell腳本的執行

當shell腳本以非交互的方式(文件方式)運行時會先找到環境變量ENV,該變量指定了一個環境文件(.bashrc bash_profile /etc/bashrc /etc/profile)然後從該環境變量開始執行,再執行shell腳本的內容。

技術分享圖片

系統環境變量不需要定義,但是用crond定時任務時要把系統環境變量在腳本中重新定義,因為crond能識別的系統環境變量很少。
可以在/etc/profile系統環境變量中定義變量,添加後就可以直接在腳本中引用了。例如在/etc/profile最下面添加export NAME=zhangsan,註意這裏的name要大寫。添加完了我們用source重啟一下腳本使修改成效,不必重啟系統。

技術分享圖片

技術分享圖片

所以有時候要定義的東西在所有腳本裏面都要用到就可以在/etc/profile中定義。

1.5 shell腳本執行的三種方式

(1) bash.script-name 和 sh.script-name (推薦使用)在執行定時任務時都要帶shell全路徑。

(2) path/script-name全路徑加腳本或./script-name(當前路徑下執行腳本)用第二種必須的有執行權限。

(3) source script-name或./script-name(註意“.”點號)

1.6 source和sh、bash的區別

source 或 “.”點號加載執行過的腳本,在腳本結束後腳本中的變量(包括函數)值,在當前shell中依然存在而sh和bash則不行。因此在做shell腳本開發時,如果腳本中有需求引用其他腳本中的內容或者配置文件是最好用“.”點號或source在腳本開頭加載該腳本或配置文件然後下面的內容就可以調用source加載的腳本及文件中的變量及函數等內容。

例如:用sh執行腳本,如下圖。

技術分享圖片

這裏echo $user 輸出的內容為空,因為用sh調用腳本user變量沒有保存下來。

下面我們再以source為例,如下圖

技術分享圖片

我們也可以在腳本中引用source 和“.”號

技術分享圖片

一些服務在/etc/init.d/下在調用系統函數庫的時候也都用的“.”點號和source,我們查看一下系統函數庫/etc/init.d/functions如下圖

技術分享圖片

還可以用source調用函數庫,action打印出很炫的結果,如下圖

技術分享圖片

上圖中的action是在/etc/init.d/functions中定義了的函數,如下圖

技術分享圖片

我們也可以自己在functions中定義函數,然後就可以調用自定義函數了。如下圖

技術分享圖片

也可以傳參,如下圖

技術分享圖片

四.Shell腳本開發基本規範及習慣

1.1 開頭指定腳本解釋器

#!/bin/bash或#!/bin/sh

1.2 開頭加版權信息

#Date: 2018-01-03 時間
#Author: Create by zbf誰創作的
#Mail: [email protected] 郵箱地址
#Function:This scripts function is ... 腳本是幹啥的
#Version: 1.1  版本

1.3 腳本中不要用中文註釋(可以用,最好別用)

盡量用英文註釋防止本機或切換系統環境後中文亂碼的困擾。

1.4 腳本以.sh擴展名

例如:script-name.sh

1.5 成對內容一次寫出來防止遺漏如

[]中括號、{}大括號、‘’單引號、“”雙引號、``
中括號[]兩端要有空格先打中括號[]將光標移到中括號裏空兩個空格再回退一個,然後再寫代碼。

1.6 流程控制語句書寫方法

流程控制語句一次書寫完成再添加內容如if 語句,for循環

shell腳本編程學習筆記-shell腳本編程基礎介紹