shell指令碼編寫守則

2021-09-26 12:24:50 字數 2158 閱讀 4400

現在centos7中使用的是bash軟體,通過以下命令可以檢視bash版本:

[root@localhost ~]# cat /etc/redhat-release     #檢視系統的版本

centos linux release 7.5.1804 (core) #我這裡使用的是centos 7.5 1804

[root@localhost ~]# bash --version #檢視bash的版本

gnu bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu) #這一行就是bash版本

許可證 gplv3+: gnu gpl 許可證版本3或者更高 這是自由軟體,您可以自由地更改和重新發布。

在法律允許的範圍內沒有擔保.

若生產環境下的伺服器使用的是較老版本的系統及shell,那麼建議將其公升級到最新版的shell,因為近兩年老版本被暴露出存在較嚴重的安全漏洞。

bash軟體曾經爆出了嚴重漏洞(破殼漏洞),憑藉此漏洞,別人可能會接管計算機的整個作業系統,得以訪問各種系統內的機密資訊,並對系統進行更改等。任何人的計算機系統,如果使用了bash軟體,都需要立即打上補丁。檢測系統是否存在漏洞的方法為:

#測試系統是否存在漏洞

[root@localhost ~]# env x='() ; echo be careful' bash -c "echo this is a test"

this is a test

返回上面的內容「this is a test」,則表示正常,若返回如下內容,則需要公升級bash了,不過,僅僅是用於學習和測試就無所謂了。

[root@localhost ~]# env x='() ; echo be careful' bash -c "echo this is a test"

be careful

this is a test

公升級方法如下:

[root@localhost ~]# rpm -qa bash    #公升級前的bash版本

bash-4.2.46-30.el7.x86_64

[root@localhost ~]# yum -y update bash #執行公升級命令

[root@localhost ~]# rpm -qa bash #公升級後的bash版本

bash-4.2.46-31.el7.x86_64

1、指令碼開頭一行註明使用的是哪種直譯器,如:#!/bin/sh、#!/bin/bash......。

2、規範指令碼的字尾名稱,如果是shell指令碼,就是「.sh」;如果是python指令碼,就是「.py」;如果是expect指令碼,就是「.exp」。

3、寫好注釋,不挨罵,指令碼中,除第一行使用#號後指定shell,以下所有的#號都表示注釋,可以和**共用一行,也可單獨寫一行,最好不要出現中文,若不寫注釋,會遭人罵的,可能自己過段時間也看不懂自己寫的指令碼了。

當shell指令碼執行時,它會先查詢系統環境變數env,該變數指定了環境檔案(載入順序通常是/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc等),在載入了上述環境變數檔案後,shell就開始執行shell指令碼中的內容

shell指令碼是從上至下、從左至右依次執行每一行的命令及語句的,即執行完了乙個命令後再執行下乙個,如果在shell指令碼中遇到子指令碼(即指令碼巢狀)時,就會先執行子指令碼的內容,完成後再返回父指令碼繼續執行父指令碼內後續的命令及語句。

shell指令碼的執行通常可以採用以下幾種方式:

結論:

通過source或「.」載入執行過的指令碼,由於是在當前shell中執行指令碼,因此在指令碼結束之後,指令碼中的變數(包括函式)值在當前shell中依然存在;而sh和bash執行指令碼時都會啟動新的子shell執行,執行完後退回到父shell。因此,變數和函式值等無法保留,在進行shell指令碼開發時,如果指令碼中有引用或執行其他指令碼的內容或配置檔案的需求時,最好用「.」或source先載入該指令碼或配置檔案,處理完成之後,再將他們載入到指令碼的下面,就可以呼叫source載入的指令碼及配置檔案中的變數及函式等內容了。

while和until,case等語句也是一樣。

編寫Shell指令碼

獲取變數的方式 1 echo path 2 echo 3 echo path 引數的提取 引數的個數 n 第n個引數 0 當前指令碼名稱 取出所有引數 shift 引數左移 執行過程 2 編寫指令碼內容 單獨講解 3 新增執行許可權 chmod a x abc.sh 4 當前目錄執行 abc.sh ...

Shell 指令碼編寫

shell 指令碼與 windows dos 下的批處理相似,也就是用各類命令預先放入到乙個檔案中,方便一次性執行的乙個程式檔案,主要是方便管理員進行設定或者管理用的。但是它比 windows 下的批處理更強大,比用其他程式設計程式編輯的程式效率更高,它使用了 linux unix 下的命令。方法一...

shell指令碼編寫

echo echo n不換行輸出,echo e會處理特殊字元,比如有 n則會換行 printf 不自動換行輸出 print 自動換行輸出 傳遞到指令碼的引數個數 以乙個單字串顯示所有向指令碼傳遞的引數。指令碼執行的當前程序id號 後台執行的最後乙個程序的id號 與 相同,但是使用時加引號,並在引號中...