
初步入門1、什么時Shell2、什么是Shell腳本3、Shell腳本在Linux運維工作中的地位4、腳本語言的種類4.1、Shell腳本語言的種類4.2、其他常用的腳本語言種類4.3、Shell腳本語言的優勢5、常用操作系統默認的Shell6、Shell腳本的建立和執行6.1、Shell腳本的建立6.2、Shell腳本的執行6.3、Shell腳本開發的基本規范及習慣1、什么時ShellShell是一個命令解釋器它的作用是解釋執行用戶輸入的命令及程序等用戶每輸入一條命令Shell就解釋執行一條。這種從鍵盤一輸入命令就可以立即得到回應的對話方式稱為交互的方式。Shell存在于操作系統的最外層負責與用戶直接對話把用戶的輸入解釋給操作系統并處理各種各樣的操作系統的輸出結果然后輸出到屏幕返回給用戶。輸入系統用戶名和密碼并登錄到Linux后的所有操作都是由Shell解釋與執行的。下圖針對命令解釋器Shell在操作系統中所處的位置給出了基本圖解。提示Shell的英文是貝殼的意思從圖中可以看出命令解釋器Shell就像貝殼一樣包住了系統核心。2、什么是Shell腳本理解了Shell之后再理解Shell腳本就簡單了。當命令或程序語句不在命令行下執行而是通過一個程序文件來執行時該程序就被稱為Shell腳本。如果在Shell腳本里內置了很多條命令、語句及循環控制然后將這些命令一次性執行完畢這種通過文件執行腳本的方式稱為非交互的方式。Shell腳本類似于DOS系統下的批處理程序早期擴展名一般為“*.bat”??。用戶可以在Shell腳本中敲入一系列的命令及命令語句組合。這些命令、變量和流程控制語句等有機地結合起來就形成了一個功能強大的Shell腳本。下面是在Windows下利用bat批處理程序開發的備份企業網站及數據庫數據的腳本范例。在Windows下利用bat批處理程序備份網站及數據庫數據的腳本。echo off set date%date:0,4%-%date:5,2%-%date:8,2% #定義時間變量。 mysqldump -uroot -poldboy -A -B D:\bak\%date%.sql #備份數據庫數據。 rar.exe a -k -r -s -m1 D:\bak\%date%.sql.rar D:\bak\%date%.sql #打包備份出來的數據庫數據。 del D:\bak\.sql #刪除未打包的無用數據庫數據。 rar.exe a -k -r -s -m1 D:\bak\%date%htdocs.rar D:\work\PHPnow\htdocs #打包站點目錄下的數據。清除/var/log下messages日志文件的簡單命令腳本。# 清除日志腳本 版本 1。cd/var/logcat/dev/nullmessagesechoLogs cleaned up.提示/var/log/messages是Linux系統的日志文件很重要。上面所示的腳本其實是有一些問題的具體如下如果不是root用戶則無法執行腳本清理日志并且會提示系統的權限報錯信息。沒有任何流程控制語句簡單地說就是只進行順序操作沒有成功判斷和邏輯嚴密性。范例寫一個包含命令、變量和流程控制的語句來清除/var/log下messages日志文件的Shell腳本。# ! /bin/bash# 清除日志腳本 版本 2LOG_DIR/var/logROOT_UID0#$UID為0的用戶即root用戶# 腳本需要使用root用戶權限來運行因此對當前用戶進行判斷對不合要求的用戶給出友好提示并終止程序運行。if[$UID-ne$ROOT_UID]#如果當前用戶不是root則不允許執行腳本。thenechoMust be root to run this script.#給出提示后退出。exit1#退出腳本。fi# 如果切換到指定目錄不成功則給出提示并終止程序運行。cd$LOG_DIR||{echoCannot change to necessary directory.exit1}# 經過上述兩個判斷后此處的用戶權限和路徑應該就是對的了只有清空成功才打印成功提示。cat/dev/nullmessages{echoLogs cleaned up.exit0# 退出之前返回0表示成功返回1表示失敗。}echoLogs cleaned up fail.exit1初學者如果想要快速掌握Shell腳本的編寫方法最有效的思路就是采用電子游戲中過關的方式比如對于范例腳本可以設計成如下幾關第一關必須是root才能執行腳本否則給出友好提示并終止腳本運行。第二關成功切換目錄cd /var/log?否則給出友好提示并終止腳本運行。第三關清理日志cat /dev/null messages?若清理成功則給出正確提示。第四關通關或失敗分別給出相應的提示echo輸出?。3、Shell腳本在Linux運維工作中的地位Shell腳本語言很適合用于處理純文本類型的數據而Linux系統中幾乎所有的配置文件、日志文件如NFS、Rsync、Httpd、Nginx、LVS、MySQL等?以及絕大多數的啟動文件都是純文本類型的文件。因此學好Shell腳本語言就可以利用它在Linux系統中發揮巨大的作用。下圖形象地展示了Shell腳本在運維工作中的地位。4、腳本語言的種類4.1、Shell腳本語言的種類Shell腳本語言是弱類型語言無須定義變量的類型即可使用?在Unix/Linux中主要有兩大類Shell一類是Bourne shell另一類是C shell。1. Bourne shellBourne shell又包括Bourne shellsh?、Korn shellksh?、Bourne Again Shellbash三種類型。Bourne shellsh由ATT的Steve Bourne開發是標準的UNIX Shell很多UNIX系統都配有sh。Korn shellksh由David Korn開發是Bourneshellsh的超集合并且添加了csh引入的新功能是目前很多UNIX系統標準配置的Shell這些系統上的/bin/sh往往是指向/bin/ksh的符號鏈接。Bourne Again Shellbash由GNU項目組開發主要目標是與POSIX標準保持一致同時兼顧對sh的兼容bash從csh和ksh借鑒了很多功能是各種Linux發行版默認配置的Shell, Linux系統上的/bin/sh往往是指向/bin/bash的符號鏈接。盡管如此bash和sh還是有很多的不同之處一方面bash擴展了一些命令和參數另一方面bash并不完全和sh兼容它們有些行為并不一致但在大多數企業運維的情況下區別不大特殊場景可以使用bash替代sh。** 2. C shell**C shell又包括csh、tcsh兩種類型。csh由Berkeley大學開發隨BSD UNIX發布它的流程控制語句很像C語言支持很多Bourne shell所不支持的功能例如作業控制、別名、系統算術、命令歷史、命令行編輯等。tcsh是csh的增強版加入了命令補全等功能在FreeBSD、Mac OS X等系統上替代了csh。以上介紹的這些Shell中較為通用的是標準的Bourneshellsh和C shellcsh?。其中Bourne shellsh已經被Bourne Again shellbash所取代??赏ㄟ^以下命令查看CentOS 6系統的Shell支持情況。[rootoldboy ]# cat /etc/shells/bin/sh#這是Linux里常用的Shell指向/bin/bash。/bin/bash#這是Linux里常用的Shell也是默認使用的Shell。/sbin/nologin#這是Linux里常用的Shell用于禁止用戶登錄。/bin/dash /bin/tcsh /bin/cshLinux系統中的主流Shell是bash, bash是由Bourne Shellsh發展而來的同時bash還包含了csh和ksh的特色但大多數腳本都可以不加修改地在sh上運行如果使用了sh后發現結果和預期有差異那么可以嘗試用bash替代sh。4.2、其他常用的腳本語言種類1. PHP語言PHP是網頁程序語言也是腳本語言。它是一款更專注于Web頁面開發前端展示的語言例如wordpress、dedecms、discuz等著名的開源產品都是用PHP語言開發的。用PHP程序語言也可以處理系統日志、配置文件等還可以調用Linux系統命令但是很少有人這么用。2. Perl語言Perl腳本語言比Shell腳本語言強大很多在2010年以前很流行它的語法靈活、復雜在實現不同的功能時可以用多種不同的方式缺點是不易讀團隊協作困難但它仍不失為一種很好的腳本語言存世的大量相關程序軟件3. Python語言Python是近幾年非常流行的語言它不但可以用于腳本程序開發也可以實現Web頁面程序開發例如CMDB管理系統?甚至還可以實現軟件的開發例如大名鼎鼎的OpenStack、SaltStack都是Python語言開發的?、游戲開發、大數據開發、移動端開發。4.3、Shell腳本語言的優勢Shell腳本語言的優勢在于處理偏操作系統底層的業務例如Linux系統內部的很多應用有的是應用的一部分都是使用Shell腳本語言開發的因為有1000多個Linux系統命令為它做支撐特別是Linux正則表達式及三劍客grep、awk、sed等命令。對于一些常見的系統腳本使用Shell開發會更簡單、更快速例如讓軟件一鍵自動化安裝、優化監控報警腳本軟件啟動腳本日志分析腳本等雖然PHP/Python語言也能夠做到這些但是考慮到掌握難度、開發效率、開發習慣等因素它們可能就不如Shell腳本語言流行及有優勢了。對于一些常規的業務應用使用Shell更符合Linux運維簡單、易用、高效的三大基本原則。PHP語言的優勢在于小型網站系統的開發Python語言的優勢在于開發較復雜的運維工具軟件、Web界面的管理工具和Web業務的開發例如CMDB自動化運維平臺、跳板機、批量管理軟件SaltStack、云計算OpenStack軟件等。我們在開發一個應用時應根據業務需求結合不同語言的優勢及自身擅長的語言來選擇揚長避短從而達到高效開發及易于自身維護等目的。5、常用操作系統默認的Shell在常用的操作系統中Linux下默認的Shell是BourneAgain shellbash; Solaris和FreeBSD下默認的是Bourne shellsh; AIX下默認的是Korn Shellksh?。這里重點講Linux系統環境下的Bourne Again shellbash?。下面來看一個企業面試題CentOS Linux系統默認的Shell是什么這題的答案就是bash。通過以下兩種方法可以查看CentOS Linux系統默認的Shell。方法1[rootoldboy ]# echo $SHELL/bin/bash方法2[rootoldboy ]# grep root /etc/passwdroot:x:0:0:root:/root:/bin/bash提示結尾的/bin/bash就是用戶登錄后的Shell解釋器。注意本書寫作的環境為Linux系統具體版本為CentOS 6.x x86_64絕大部分已寫好的腳本程序都不需要經過任何修改就可以直接應用于其他的Linux系統中。對于一些UNIX系統因為默認不是bash解釋器所以需要根據解釋器版本進行調整本書的全部內容都是以bash及和bash兼容的sh解釋器為基礎編寫的。6、Shell腳本的建立和執行6.1、Shell腳本的建立在Linux系統中Shell腳本bash Shell程序通常是在編輯器vi/vim中編寫的由UNIX/Linux命令、bash Shell命令、程序結構控制語句和注釋等內容組成。這里推薦用Linux自帶的功能更強大的vim編輯器來編寫可以事先做一個別名alias vi‘vim’并使其永久生效這樣以后習慣輸入vi的讀者也就可以直接調用vim編輯器了設置方法如下[rootoldboy ]# echo alias vivim /etc/profile[rootoldboy ]# tail -1 /etc/profilealiasvivim[rootoldboy ]# source /etc/profile1腳本開頭第一行一個規范的Shell腳本在第一行會指出由哪個程序解釋器來執行腳本中的內容這一行內容在Linux bash的編程一般為#! /bin/bash或#! /bin/sh #255個字符以內。其中開頭的“#! ”字符又稱為幻數其實叫什么都無所謂知道它的作用就好?在執行bash腳本的時候內核會根據“#! ”后的解釋器來確定該用哪個程序解釋這個腳本中的內容。注意這一行必須位于每個腳本頂端的第一行如果不是第一行則為腳本注釋行例如下面的例子。[oldboyoldboy ]$cattest.sh#! /bin/bashechooldboy start#! /bin/bash #寫到這里就是注釋了。#! /bin/sh #寫到這里就是注釋了。echooldboy end2. bash與sh 的區別早期的bash與sh稍有不同它還包含了csh和ksh的特色但大多數腳本都可以不加修改地在sh上運行比如[rootoldboy ]# ll /bin/shlrwxrwxrwx.1root root43月1920:54 /bin/sh -bash[rootoldboy ]# ll /bin/bash-rwxr-xr-x1root root94041610月1621:56 /bin/bash提示sh為bash的軟鏈接大多數情況下腳本的開頭使用“#! /bin/bash”和“#! /bin/sh”是沒有區別的但更規范的寫法是在腳本的開頭使用“#!/bin/bash”?。下面的Shell腳本是系統自帶的軟件啟動腳本的開頭部分。[rootoldboy ]# head -1 /etc/init.d/sshd#! /bin/bash[rootoldboy ]# head -1 /etc/init.d/ntpd#! /bin/bash[rootoldboy ]# head -1 /etc/init.d/crond#! /bin/sh提示如果使用/bin/sh執行腳本出現異常那么可以再使用/bin/bash試一試但是一般不會發生此類情況。一般情況下在安裝Linux系統時會自動安裝好bash軟件查看系統的bash版本的命令如下。[rootoldboy ]# cat /etc/redhat-releaseCentOS release6.8(Final)#這里顯示的是作者寫作的Linux的環境版本。[rootoldboy ]# bash --versionGNU bash, version4.1.2(1)-release(x86_64-redhat-linux-gnu)#這里顯示的是bash的版本。Copyright(C)2009Free Software Foundation, Inc.#下面幾行是自由軟件提示的相關信息。License GPLv3: GNU GPL version3or later http://gnu.org/licenses/gpl.html This isfreesoftware;you arefreeto change and redistribute it. There is NO WARRANTY, to the extent permitted by law.如果讀者使用的是較老版本的Shell那么建議將其升級到最新版本的Shell特別是企業使用因為近兩年老版本的bash被暴露出存在較嚴重的安全漏洞。例如bash軟件曾經爆出了嚴重漏洞破殼漏洞?憑借此漏洞攻擊者可能會接管計算機的整個操作系統得以訪問各種系統內的機密信息并對系統進行更改等。任何人的計算機系統如果使用了bash軟件都需要立即打上補丁。檢測系統是否存在漏洞的方法為[rootoldboy ]# env x() { :; }; echo be careful bash -c echo this is a testthis is atest如果返回如下兩行則表示需要盡快升級bash了不過僅僅是用于學習和測試就無所謂了。be careful this is atest升級方法為[rootoldboy ]# yum -y update bash[rootoldboy ]# rpm -qa bashbash-4.1.2-40.el6.x86_64下面是Linux中常用腳本開頭的寫法不同語言的腳本在開頭一般都要加上如下標識內容1#! /bin/sh2#! /bin/bash3#! /usr/bin/awk4#! /bin/sed5#! /usr/bin/tcl6#! /usr/bin/expect #expect解決交互式的語言開頭解釋器。7#! /usr/bin/perl #perl語言解釋器。8#! /usr/bin/env python #python語言解釋器。CentOS和Red Hat Linux下默認的Shell均為bash。因此在寫Shell腳本的時候腳本的開頭即使不加“#!/bin/bash”?它也會交給bash解釋。如果寫腳本不希望使用系統默認的Shell解釋那么就必須要指定解釋器了否則腳本文件執行后的結果可能就不是你所要的。建議讀者養成好的編程習慣不管采用什么腳本最好都加上相應的開頭解釋器語言標識遵守Shell編程規范。如果在腳本開頭的第一行不指定解釋器那么就要用對應的解釋器來執行腳本這樣才能確保腳本正確執行。例如如果是Shell腳本就用bash test.sh執行test.sh。如果是Python腳本就用python test.py執行test.py。如果是expect腳本就用expect test.exp執行test.exp。3腳本注釋在Shell腳本中跟在#后面的內容表示注釋用來對腳本進行注釋說明注釋部分不會被當作程序來執行僅僅是給開發者和使用者看的系統解釋器是看不到的更不會執行。注釋可自成一行也可以跟在腳本命令的后面與命令在同一行。開發腳本時如果沒有注釋那么團隊里的其他人就會很難理解腳本對應內容的用途而且若時間長了自己也會忘記。因此我們要盡量養成為所開發的Shell腳本書寫關鍵注釋的習慣書寫注釋不光是為了方便別人更是為了方便自己避免影響團隊的協作效率以及給后來接手的人帶來維護困難。特別提示一下注釋盡量不要用中文在腳本中最好也不要有中文。6.2、Shell腳本的執行當Shell腳本運行時它會先查找系統環境變量ENV該變量指定了環境文件加載順序通常是/etc/profile、/.bash_profile、/.bashrc、/etc/bashrc等?在加載了上述環境變量文件后Shell就開始執行Shell腳本中的內容?。Shell腳本是從上至下、從左至右依次執行每一行的命令及語句的即執行完了一個命令后再執行下一個如果在Shell腳本中遇到子腳本即腳本嵌套時就會先執行子腳本的內容完成后再返回父腳本繼續執行父腳本內后續的命令及語句。通常情況下在執行Shell腳本時會向系統內核請求啟動一個新的進程以便在該進程中執行腳本的命令及子Shell腳本基本流程如下圖所示。特殊技巧設置Linux的crond任務時最好能在定時任務腳本中重新定義系統環境變量否則一些系統環境變量將不會被加載這個問題需要注意Shell腳本的執行通??梢圆捎靡韵聨追N方式。1bash script-name或sh script-name這是當腳本文件本身沒有可執行權限即文件權限屬性x位為-號時常使用的方法或者腳本文件開頭沒有指定解釋器時需要使用的方法。這也是老男孩推薦使用的方法。2path/script-name或/script-name指在當前路徑下執行腳本腳本需要有執行權限?需要將腳本文件的權限先改為可執行即文件權限屬性加x位?具體方法為chmod x script-name。然后通過腳本絕對路徑或相對路徑就可以直接執行腳本了。在企業生產環境中不少運維人員在寫完Shell腳本之后由于忘記為該腳本設置執行權限然后就直接應用了結果導致腳本沒有按照自己的意愿手動或定時執行對于這一點避免出現該問題的方法就是用第1種方法替代第2種。3source script-name或script-name這種方法通常是使用source或“.”?點號讀入或加載指定的Shell腳本文件如san.sh?然后依次執行指定的Shell腳本文件san.sh中的所有語句。這些語句將在當前父Shell腳本father.sh進程中運行其他幾種模式都會啟動新的進程執行子腳本?。因此使用source或“.”可以將san.sh自身腳本中的變量值或函數等的返回值傳遞到當前父Shell腳本father.sh中使用。這是它和其他幾種方法最大的區別也是值得讀者特別注意的地方。source或“.”命令的功能是在當前Shell中執行source或“.”加載并執行的相關腳本文件中的命令及語句而不是產生一個子Shell來執行文件中的命令。注意“.”和后面的腳本名之間要有空格。如果讀者學過PHP開發就會明白source或“.”相當于include的功能。HTTP服務軟件Apache、Nginx等配置文件里都支持這樣的用法。4shscript-name或cat scripts-name|sh同樣適用于bash不過這種用法不是很常見但有時也可以有出奇制勝的效果例如不用循環語句來實現精簡開機自啟動服務的案例就是通過將所有字符串拼接為命令的形式然后經由管道交給bash操作的案例。范例創建模擬腳本test.sh并輸入如下內容。[oldboyoldboy ]$cattest.sh#編輯test.sh腳本文件。echoI am oldboy輸入“echo ‘I am oldboy’”內容后按回車鍵然后再按Ctrld組合鍵結束編輯。此操作為特殊編輯方法這里是作為cat用法的擴展知識通過使用來記憶是個好習慣?。現在使用第1種方法實踐命令如下[oldboyoldboy ]$cattest.shechoI am oldboy[oldboyoldboy ]$shtest.sh#使用第1種方式的sh命令執行test.sh腳本文件。I am oldboy[oldboyoldboy ]$bashtest.sh#使用第1種方式的bash命令執行test.sh腳本文件。I am oldboy這里使用第1種方法的bash和sh均可以執行腳本并得到預期的結果。使用第2種方法實踐命令如下[oldboyoldboy ]$.test.sh#請注意開頭的“.”后面有空格。I am oldboy[oldboyoldboy ]$sourcetest.sh I am oldboy提示?“.”或source命令的功能相同都是讀入腳本并執行腳本。給test.sh添加可執行權限命令如下[oldboyoldboy ]$chmodux test.sh[oldboyoldboy ]$ ./test.sh I am oldboy可以看到給test.sh加完可執行權限后就能執行了。前面也提到了這種方法在使用前每次都需要給定執行權限但容易被忘記且多了一些步驟增加了復雜性。使用第3種方法實踐時會將source或“.”執行的腳本中的變量值傳遞到當前的Shell中如下[oldboyoldboy ]$echouserdirpwdtestsource.sh#第一行的內容通常用echo處理更方便[oldboyoldboy ]$cattestsource.shuserdirpwd#定義了一個命令變量內容是打印當前路徑。注意打印命令用反引號[oldboyoldboy ]$shtestsource.sh#采用sh命令執行腳本[oldboyoldboy ]$echo$userdir#此處為空并沒有出現當前路徑/home/oldboy的輸出這是為什么根據上面的例子可以發現通過sh或bash命令執行過的腳本若在腳本結束之后在當前Shell窗口中查看userdir變量的值會發現值是空的?,F在以同樣的步驟改用source或“.”執行然后再看看userdir變量的值[oldboyoldboy ]$sourcetestsource.sh#采用source執行同一腳本[oldboyoldboy ]$echo$userdir/home/oldboy#此處輸出了當前路徑/home/oldboy這又是為什么呢來了解一下系統NFS服務的腳本是如何使用“.”的# Source function library../etc/init.d/functions#通過.加載系統函數庫functions說明操作系統及服務自帶的腳本是我們學習的標桿和參考雖然有時感覺這些腳本也不是十分規范?。結論通過source或“.”加載執行過的腳本由于是在當前Shell中執行腳本因此在腳本結束之后腳本中的變量包括函數值在當前Shell中依然存在而sh和bash執行腳本都會啟動新的子Shell執行執行完后退回到父Shell。因此變量包括函數值等無法保留。在進行Shell腳本開發時如果腳本中有引用或執行其他腳本的內容或配置文件的需求時最好用“.”或source先加載該腳本或配置文件處理完之后再將它們加載到腳本的下面就可以調用source加載的腳本及配置文件中的變量及函數等內容了。以下采用第4種方法來實踐[rootoldboy ]# ls -l oldboy.sh-rw-r--r--.1root root28Nov1815:52 oldboy.sh[rootoldboy ]# cat oldboy.shechoI am oldboy teacher.[rootoldboy ]# sholdboy.sh #盡量不要使用這種方法。I am oldboy teacher.[rootoldboy ]# cat oldboy.sh|bash #這種方法在命令行拼接字符串命令后需要執行時就會用到 I am oldboy teacher.提示代碼中提到的兩種執行方法相當于sh scripts-name效率很高但是初學者用得少。范例已知如下命令及返回結果請問echo $user的返回的結果為??。[oldboytest ]$cattest.shuserwhoami[oldboytest ]$shtest.sh[oldboytest ]$echo$user參考的選擇項如下a當前用戶boldboyc空無內容輸出這是某互聯網公司Linux運維職位的筆試題。在這里c是正確答案原因前面已經講過了即使用sh執行腳本會導致當前Shell無法獲得變量值。通過上述面試題可得出如下的結論兒子Shell腳本會直接繼承父親Shell腳本的變量、函數就好像是兒子隨父親姓基因也會繼承父親的等反之則不可以。如果希望反過來繼承就好像是讓父親隨兒子姓讓父親的基因也繼承兒子的?就要用source或“.”在父親Shell腳本中事先加載兒子Shell腳本。6.3、Shell腳本開發的基本規范及習慣Shell腳本的開發規范及習慣非常重要雖然這些規范不是必須要遵守的但有了好的規范和習慣可以大大提升開發效率并能在后期降低對腳本的維護成本。當多人協作開發時大家有一個互相遵守的規范就顯得更重要了。即使只是一個人開發最好也采取一套固定的規范這樣腳本將會更易讀、更易于后期維護最重要的是要讓自己養成一個一出手就很專業和規范的習慣。下面來看看有哪些規范這些規范在第14章也會提及以便于大家進一步鞏固。1Shell腳本的第一行是指定腳本解釋器通常為#! /bin/bash或#! /bin/sh2Shell腳本的開頭會加版本、版權等信息# Date: 16:29 2012-3-30# Author: Created by oldboy# Blog:http://oldboy.blog.51cto.com# Description:This scripts function is.....# Version:1.1可修改“/.vimrc”配置文件配置vim編輯文件時自動加上以上信息的功能。3在Shell腳本中盡量不用中文不限于注釋?。盡量用英文注釋防止本機或切換系統環境后中文亂碼的困擾。如果非要加中文請根據自身的客戶端對系統進行字符集調整如export LANG“zh_CN.UTF-8”并在腳本中重新定義字符集設置和系統保持一致。4Shell腳本的命名應以sh為擴展名。例如script-name.sh5Shell腳本應存放在固定的路徑下。例如/server/scripts以下則是Shell腳本代碼書寫的良好習慣。1成對的符號應盡量一次性寫出來然后退格在符號里增加內容以防止遺漏。這些成對的符號包括{}、[]、、、2中括號?[?]?兩端至少要有1個空格因此鍵入中括號時即可留出空格[ ]?然后再退格鍵入中間的內容并確保兩端都至少有一個空格即先鍵入一對中括號然后退1格輸入兩個空格再退1格雙中括號?[?[?]?]?的寫法也是如此。3對于流程控制語句應一次性將格式寫完再添加內容。比如一次性完成if語句的格式應為if條件內容then內容fi一次性完成for循環語句的格式應為fordo內容done4通過縮進讓代碼更易讀比如if條件內容then內容fi5對于常規變量的字符串定義變量值應加雙引號并且等號前后不能有空格需要強引用的指所見即所得的字符引用?則用單引號’ ?如果是命令的引用則用反引號?。例如OLDBOY_FILEtest.txt6腳本中的單引號、雙引號及反引號必須為英文狀態下的符號其實所有的Linux字符及符號都應該是英文狀態下的符號這點需要特別注意。