1. 程式人生 > >Linux 編寫一個簡單的Shell指令碼

Linux 編寫一個簡單的Shell指令碼

       如果我們想讓shell 來完成更多的工作,通過把我們的工具一起放置到我們自己設計的程式中,然後shell 就會自己來執行這些複雜的任務序列。通過編寫shell 指令碼,我們讓shell 來做這些事情。

什麼是shell 指令碼

       最簡單的解釋,一個shell 指令碼就是一個包含一系列命令的檔案。shell 讀取這個檔案,然後執行檔案中的所有命令,就好像這些命令已經直接被輸入到了命令列中一樣。
       Shell 有些獨特,因為它不僅是一個功能強大的命令列介面, 也是一個指令碼語言直譯器。我們將會看到,大多數能夠在命令列中完成的任務也能夠用指令碼來實現,同樣地,大多數能用指令碼實現的操作也能夠在命令列中完成。
       雖然我們已經介紹了許多shell 功能,但只是集中於那些經常直接在命令列中使用的功能。Shell 也提供了一些通常(但不總是)在編寫程式時才使用的功能。

怎樣編寫一個shell 指令碼

       為了成功地建立和執行一個shell 指令碼,我們需要做三件事情:
      1. 編寫一個指令碼。Shell 指令碼就是普通的文字檔案。所以我們需要一個文字編輯器來書寫它們。最好的文字編輯器都會支援語法高亮,這樣我們就能夠看到一個指令碼關鍵字的彩
色編碼檢視。語法高亮會幫助我們檢視某種常見錯誤。為了編寫指令碼檔案,vim,gedit,kate,和許多其它編輯器都是不錯的候選者。
      2. 使指令碼檔案可執行。系統會相當挑剔不允許任何舊的文字檔案被看作是一個程式,並且有充分的理由! 所以我們需要設定指令碼檔案的許可權來允許其可執行。
      3. 把指令碼放置到shell 能夠找到的地方當沒有指定可執行檔案明確的路徑名時,shell 會自動地搜尋某些目錄,來查詢此可執行檔案。為了最大程度的方便,我們會把指令碼放到這些目錄當中。

指令碼檔案格式

       為了保持程式設計傳統,我們將建立一個“hello world”程式來說明一個極端簡單的指令碼。所以讓我們啟動我們的文字編輯器,然後輸入以下指令碼:

#!/bin/bash
# This is our first script.
echo 'Hello World!'

       對於指令碼中的最後一行,我們應該是相當的熟悉,僅僅是一個帶有一個字串引數的echo 命令。對於第二行也很熟悉。它看起來像一個註釋,我們已經在許多我們檢查和編輯過的配置檔案中看到過。關於shell 指令碼中的註釋,它們也可以出現在文字行的末尾,像這樣:

echo 'Hello World!' # This is a comment too

文字行中,# 符號之後的所有字元都會被忽略。
類似於許多命令,這也在命令列中起作用:

[[email protected] ~]$ echo 'Hello World!' # This is a comment too
Hello World!

雖然很少在命令列中使用註釋,但它們也能起作用。
       我們指令碼中的第一行文字有點兒神祕。它看起來它應該是一條註釋,因為它起始於一個# 符號,但是它看起來太有意義,以至於不僅僅是註釋。事實上,這個#! 字元序列是一種特殊的結構叫做shebang。這個shebang 被用來告訴作業系統將執行此指令碼所用的直譯器的名字。每個shell 指令碼都應該把這一文字行作為它的第一行。
讓我們把此指令碼檔案儲存為hello_world。

可執行許可權

下一步我們要做的事情是讓我們的指令碼可執行。使用chmod 命令,這很容易做到:

[[email protected] ~]$ ls -l hello_world
-rw-r--r-- 1         me         me            63 2009-03-07 10:10 hello_world
[[email protected] ~]$ chmod 755 hello_world
[[email protected] ~]$ ls -l hello_world
-rwxr-xr-x 1       me         me            63 2009-03-07 10:10 hello_world

       對於指令碼檔案,有兩個常見的許可權設定;許可權為755 的指令碼,則每個人都能執行,和許可權為700 的指令碼,只有檔案所有者能夠執行。注意為了能夠執行指令碼,指令碼必須是可讀的。

指令碼檔案位置

當設定了指令碼許可權之後,我們就能執行我們的指令碼了:

[[email protected] ~]$ ./hello_world
Hello World!

為了能夠執行此指令碼,我們必須指定指令碼檔案明確的路徑。如果我們沒有那樣做,我們會得到這樣的提示:

[[email protected] ~]$ hello_world
bash: hello_world: command not found

       為什麼會這樣呢?什麼使我們的指令碼不同於其它的程式?結果證明,什麼也沒有。我們的指令碼沒有問題。是指令碼儲存位置的問題。我們瞭解到PATH 環境變數及其它在系統查詢可執行程式方面的作用。回顧一下,如果沒有給出可執行程式的明確路徑名,那麼系統每次都會搜尋一系列的目錄,來查詢此可執行程式。這個/bin 目錄就是其中一個系統會自動搜尋的目錄。這個目錄列表被儲存在一個名為PATH 的環境變數中。這個PATH 變數包含一個由冒號分隔開的目錄列表。我們可以檢視PATH 的內容:

[[email protected] ~]$ echo $PATH
/home/me/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games

       這裡我們看到了我們的目錄列表。如果我們的指令碼駐紮在此列表中任意目錄下,那麼我們的問題將會被解決。注意列表中的第一個目錄,/home/me/bin。大多數的Linux 發行版會配置PATH 變數,讓其包含一個位於使用者家目錄下的bin 目錄,從而允許使用者能夠執行他們自己的程式。所以如果我們建立了一個bin 目錄,並把我們的指令碼放在這個目錄下,那麼這個指令碼就應該像其它程式一樣開始工作了:

[[email protected] ~]$ mkdir bin
[[email protected] ~]$ mv hello_world bin
[[email protected] ~]$ hello_world
Hello World!

它的確工作了。
如果這個PATH 變數不包含這個目錄,我們能夠輕鬆地新增它,通過在我們的.bashrc 檔案中包含下面這一行文字:
export PATH=~/bin:"$PATH"
當做了這個修改之後,它會在每個新的終端會話中生效。為了把這個修改應用到當前的終端會話中,我們必須讓shell 重新讀取這個.bashrc 檔案。這可以通過“sourcing”.bashrc 檔案來完成:
[[email protected] ~]$ . .bashrc
這個點(.)命令是source 命令的同義詞,一個shell 內部命令,用來讀取一個指定的shell命令檔案,並把它看作是從鍵盤中輸入的一樣。

注意:在Ubuntu 系統中,如果存在/bin 目錄,當執行使用者的.bashrc 檔案時,Ubuntu 會自動地新增這個/bin 目錄到PATH 變數中。所以在Ubuntu 系統中,如果我們建立了這個/bin 目錄,隨後退出,然後再登入,一切會正常執行。

指令碼檔案的好去處

       這個/bin 目錄是存放為個人所用指令碼的好地方。如果我們編寫了一個指令碼,系統中的每個使用者都可以使用它,那麼這個指令碼的傳統位置是/usr/local/bin。系統管理員使用的指令碼經常放到/usr/local/sbin 目錄下。大多數情況下,本地支援的軟體,不管是指令碼還是編譯過的程式,都應該放到/usr/local 目錄下,而不是在/bin 或/usr/bin 目錄下。這些目錄都是由Linux 檔案系統層次結構標準指定,只包含由Linux 發行商所提供和維護的檔案。

更多的格式技巧

     嚴肅認真的指令碼書寫,一個關鍵目標是為了維護方便;也就是說,一個指令碼可以輕鬆地被作者或其它使用者修改,使它適應變化的需求。使指令碼容易閱讀和理解是一種方便維護的方法。

長選項名稱

我們學過的許多命令都以長短兩種選項名稱為特徵。例如,這個ls 命令有許多選項既可以用短形式也可以用長形式來表示。例如:

[[email protected] ~]$ ls -ad

和:

[[email protected] ~]$ ls --all --directory

是等價的命令。為了減少輸入,當在命令列中輸入選項的時候,短選項更受歡迎,但是當書寫指令碼的時候,長選項能提供可讀性。

縮排和行繼續符

當僱傭長命令的時候,通過把命令在幾個文字行中展開,可以提高命令的可讀性。比如下面一個特別長的find 命令例項:

[[email protected] ~]$ find playground \( -type f -not -perm 0600 -exec chmod 0600 ‘{}’ ‘;’ \) -or \( -type d -not -perm 0711 -exec chmod 0711 ‘{}’ ‘;’ \)

顯然,這個命令有點兒難理解,當第一眼看到它的時候。在指令碼中,這個命令可能會比較容易理解,如果這樣書寫它:

find playground \
\( \
-type f \
-not -perm 0600 \
-exec chmod 0600 ‘{}’ ‘;’ \
\) \
-or \
\( \
-type d \
-not -perm 0711 \
-exec chmod 0711 ‘{}’ ‘;’ \
\)

       通過使用行繼續符(反斜槓-回車符序列)和縮排,這個複雜命令的邏輯性更清楚地描述給讀者。這個技巧在命令列中同樣生效,雖然很少使用它,因為輸入和編輯這個命令非常麻煩。指令碼和命令列的一個區別是,指令碼可能僱傭tab 字元拉實現縮排,然而命令列卻不能,因為tab 字元被用來啟用自動補全功能。

為書寫指令碼配置vim
這個vim 文字編輯器有許多許多的配置設定。有幾個常見的選項能夠有助於指令碼書寫:
:syntax on
        開啟語法高亮。通過這個設定,當檢視指令碼的時候,不同的shell 語法元素會以不同的顏色顯示。這對於識別某些程式設計錯誤很有幫助。並且它看起來也很酷。注意為了這個功能起作用,你必須安裝了一個完整的vim 版本,並且你編輯的檔案必須有一個shebang,來說明這個檔案是一個shell 指令碼。如果對於上面的命令,你遇到了困難,試試:set syntax=sh。
:set hlsearch
       開啟這個選項是為了高亮查詢結果。比如說我們查詢單詞“echo”。通過設定這個選項,這個單詞的每個例項會高亮顯示。
:set tabstop=4
       設定一個tab 字元所佔據的列數。預設是8 列。把這個值設定為4(一種常見做法),從而讓長文字行更容易適應螢幕。
:set autoindent
        開啟“auto indent” 功能。這導致vim 能對新的文字行縮排與剛輸入的文字行相同的列數。對於許多程式設計結構來說,這就加速了輸入。停止縮排,輸入Ctrl-d。通過把這些命令(沒有開頭的冒號字元)新增到你的/.vimrc 檔案中,這些改動會永久生效。

相關推薦

Linux 編寫一個簡單Shell指令碼

       如果我們想讓shell 來完成更多的工作,通過把我們的工具一起放置到我們自己設計的程式中,然後shell 就會自己來執行這些複雜的任務序列。通過編寫shell 指令碼,我們讓shell 來做這些事情。 什麼是shell 指令碼        最簡單的解釋,一

Linux 編寫一個簡單的一鍵指令碼

Linux中我們安裝軟體或者一些常用操作,都會接觸很多命令,有時在關鍵時刻往往因為忘了一些簡單的命令而苦惱,這時,我們不妨把命令寫成可執行的批量指令碼,可以減少很多重複而又容易忘記的程式碼,寫成一鍵指令

linux編寫自啟動shell指令碼

1.需求分析    在很多情況下,程式設計師都做著重複枯燥的工作,雖然這些工作也是必須的,其實這些重複性的工作可以執行指令碼替代;今天筆者就如何編寫自啟動shell指令碼減少程式設計師開啟伺服器後的環境開啟工作; 2.配置環境 linux版本:centos-6.3

Linux "編寫一個shell指令碼,讓使用者輸入某個目錄名/使用者名稱,先判斷輸入名稱是否存在且是個目錄名稱"及其變式

(3)shell指令碼,提示使用者輸入一個使用者名稱,如果存在;顯示使用者UID和SHELL資訊;否則,則顯示無此使用者;顯示完成之後,提示使用者再次輸入;如果是quit則退出 https://www.cnblogs.com/wangyuebo/p/5836

shell編寫一個簡單的jmeter自動化壓測指令碼

在公司做壓力測試也挺長時間了,每次測試前環境資料準備都需要話費較長時間,所以一直在考慮能不能將整個過程實現自動化進行,於是就抽空寫了一個自動化指令碼,當然這個指令碼目前功能十分簡陋,程式碼也不完善,很有很多需要改的地方,後續再優化。文中如有錯誤或者不妥之處,還望指教。 一、設計思路

MAC編寫一個簡單shell指令碼

1.寫一個“hello world” 通過程式碼編輯軟體2.編寫#! /bin/bash echo ‘hello world‘ 3.命名為aa.sh 4.通過命令終端開啟這個檔案(或者找到這個檔案直接

【原】shell編寫一個簡單的jmeter自動化壓測腳本

image tac vbo 用戶數 osx dot png das uvc 在公司做壓力測試也挺長時間了,每次測試前環境數據準備都需要話費較長時間,所以一直在考慮能不能將整個過程實現自動化進行,於是就抽空寫了一個自動化腳本,當然這個腳本目前功能十分簡陋,代碼也不完善,很有很

Linux中的四個簡單shell指令碼

1.列印Hello World! #!/bin/bash #Program: # This program shows "Hello World!" in your screen. #History: #2018/11/17 caiyuting First release P

三個簡單shell指令碼編寫

 Linux練習內容: 1.編寫shell指令碼,利用陣列存放3個字串,再利用for迴圈將它們顯示在螢幕上。 陣列不需要定義,下標從0開始,直接賦值即可,這樣賦值:arr[0]=zb 2.編寫shell指令碼,利用cat命令顯示指定目錄下的多個指定檔案,指令碼的第一個引數指

一個備份MySQL資料庫的簡單Shell指令碼

Shell指令碼是我們寫不同型別命令的一種指令碼,這些命令在這一個檔案中就可以執行。我們也可以逐一敲入命令手動執行。如果我們要使用shell指令碼就必須在一開始把這些命令寫到一個文字檔案中,以後就可以隨意反覆執行這些命令了。 我首先要在本文帶給你的是完整指令碼。後面會對

linux下分析多個目錄和檔案行數的簡單shell指令碼分享(畢設程式碼行數統計實用工具)

使用方法1. 在自己的linux機器上新建一個wrodcount.sh,然後將下方原始碼copy進去2. 執行指令碼命令,然後第一個引數是要統計的字尾名,後面跟要統計的所有路徑(相對絕對路徑都可以)使用方法樣例./wordcount.sh 'php' '../Tool/' '

如何編寫一個簡單Linux驅動(三)——完善裝置驅動

前期知識   1.如何編寫一個簡單的Linux驅動(一)——驅動的基本框架   2.如何編寫一個簡單的Linux驅動(二)——裝置操作集file_operations 前言   在上一篇文章中,我們編寫裝置驅動遇到了不少問題:   (1) 註冊裝置時,裝置號需要程式設計師給定,每次編寫驅動時,程式設計師需要知

Golang中使用heap編寫一個簡單高效的定時器模塊

true pop 邏輯 .com light 初始化 callback before cell 定時器模塊在服務端開發中非常重要,一個高性能的定時器模塊能夠大幅度提升引擎的運行效率。使用Golang和heap實現一個通用的定時器模塊,代碼來自:https://github.

手把手教你編寫一個簡單的PHP模塊形態的後門

cpp rest xtu job ring 事先 們的 original call 看到Freebuf 小編發表的用這個隱藏於PHP模塊中的rootkit,就能持久接管服務器文章,很感興趣,苦無作者沒留下PoC,自己研究一番,有了此文 0×00. 引言 PHP是一個非常流行

如何用Java編寫一個簡單的服務器和客戶機

exce 解決 對賬 location exceptio acc 明顯 隊列 客戶 今天我要向大家介紹的是自己編寫的一個比較簡單的服務器和客戶機程序,註意一下哦,比較簡單。好了,閑話休提,砸門直入主題。 小編先從客戶機和服務器的模型開始講解。

編寫一個簡單的TCP服務端和客戶端

不同的 大連 終端 服務器端 com 讀寫 所有 字數 資料 下面的實驗環境是linux系統。 效果如下: 1.啟動服務端程序,監聽在6666端口上 2.啟動客戶端,與服務端建立TCP連接 3.建立完TCP連接,在客戶端上向服務端發送消息 4.斷開

編寫一個簡單的單元測試用例

ide bsp span log 加減乘除 self teardown __main__ str 開發一個簡單的計算器,用於計算兩個數的加減乘除,示例: 1 class Calculator(): 2 ‘‘‘實現簡單的加減乘除‘‘‘ 3 def _

使用js編寫一個簡單的運動框架

parse 獲取當前值 進一步 filter 獲取 win logs alt htm 下班後,,沒事搗鼓搗鼓個人的小愛好。 首先,說明我的這個運動框架(css所有屬性)也是常見的框架一種,健壯性並不是太好,對於新手學習倒是挺好,,若是大神,老司機請拐彎。

編寫一個簡單登錄驗證需要記錄日誌,Servlet中的Cookie

cookie java servlet j2ee javaweb 登錄驗證並記錄日誌之前介紹了如何使用Server、mysql、tomcat等知識點編寫了一個簡單的登錄驗證。但是現在有了一個新的需求,我想要在登錄成功的時候往數據庫記錄一條日誌,登錄失敗的時候也要記錄一下。這個日誌要記錄用戶

如何用VBS編寫一個簡單的惡搞腳本

程序 一個 復制 文件夾 組合 不支持 文字 sendkeys 選項 windows系統的電腦, 首先右擊桌面,選擇新建-文本文檔,在桌面上新建一個文本文檔; 隨後打開計算機或者是我的電腦,點擊其中的組織(xp系統多為工具),選擇下面的文件夾和搜索