來自:Linux中國
連結:https://linux.cn/article-9919-1.html
原文:https://opensource.com/article/18/7/admin-guide-bash
每個職業都有最常用的工具。對於許多系統管理員來說,shell可能是比較熟悉的。在大多數Linux和其他類Unix系統上,預設的shell是Bash。
Bash是一個相當古老的程式,它起源於20世紀80年代後期。但它建立在更多,更老的shell上,比如C shell(csh)。我們來看看一些基礎知識。
相信你在某些時候,曾無意中以root身份執行命令並導致某種問題?這裡有一些非常簡單的技巧可以防止你遇到這樣的問題。
使用別名
首先,為mv和rm等命令設定別名,指向mv -I和rm -I。這將確保執行rm -f/boot至少要求你確認。在紅帽企業版Linux中,如果你使用root帳戶,則預設設定這些別名。
如果你還要為普通使用者帳戶設定這些別名,只需將這兩行放入主目錄中名為.bashrc的檔案中(這些也適用於sudo):
alias mv=’mv -i’
alias rm=’rm -i’
你的根提示符
你可以採取的另一項措施是防止意外發生,確保你在使用root帳戶時知道。我通常這樣做是為了讓我的正常日常工作中使用的提示能夠很好地突出根提示符。
如果將以下內容放入root的主目錄中的.bashrc檔案中,你將看到一個黑色的紅色根提示符,清楚地表明你(或其他任何人)應該謹慎操作。
export PS1=”\[$(tput bold)$(tput setab 0)$(tput setaf 1)\]\u@\h:\w # \[$(tput sgr0)\]”
實際上,你應該盡可能避免以root使用者身份登入,而是透過sudo執行大多數系統管理命令,但這是另一回事。
實施了一些小技巧來幫助防止使用root帳戶的“無意的副作用”,讓我們看看Bash可以給你你在日常工作中帶來怎樣的幫助?
控制history檔案你可能知道,當在Bash中按向上箭頭鍵時,你可以檢視並重覆使用以前的所有命令。這是因為這些命令已儲存到主目錄中名為.bash_history的檔案中。該歷史檔案附帶了一組非常有用的設定和命令。
首先,你可以透過鍵入歷史記錄來檢視整個最近的命令歷史記錄,或者你可以透過鍵入歷史記錄,或將其限製為最近30個命令。你可以更好地控制Bash儲存的內容以及儲存方式。
例如,如果將以下內容新增到.bashrc,則任何以空格開頭的命令都不會儲存到歷史記錄串列中:
HISTCONTROL=ignorespace
如果你需要用命令寫入明文形式的密碼。(是的,這太可怕了,但它仍然會發生。)
如果你不希望在歷史記錄中顯示經常執行的命令,請使用:
HISTCONTROL=ignorespace:erasedups
這樣,每次使用命令時,都會從歷史記錄檔案中刪除之前發生的所有事件,並且只將最後一次呼叫儲存到歷史記錄串列中。
我特別喜歡的歷史記錄設定是HISTTIMEFORMAT設定。這將在歷史記錄檔案中新增時間戳前的所有條目。例如,我使用:
HISTTIMEFORMAT=”%F %T “
當我輸入五條歷史記錄時,我得到了很好的完整資訊,如下所示:
1009 2018-06-11 22:34:38 cat /etc/hosts
1010 2018-06-11 22:34:40 echo $foo
1011 2018-06-11 22:34:42 echo $bar
1012 2018-06-11 22:34:44 ssh myhost
1013 2018-06-11 22:34:55 vim .bashrc
這使我更容易瀏覽我的命令歷史記錄,並找到我兩天前用來建立到家中的SSH隧道。
最好的Bash實踐
在編寫Bash指令碼時,我將用最好的11個用法列出來(我是這樣認為的)。
11.Bash指令碼可能變得複雜,新增註釋沒那麼複雜。因為如果你在週末之後回到工作中,不得不花時間搞清楚你上週五想要做什麼的話,別忘了新增註釋。
10.用花括號括起所有變數名,比如 {variable} _suffix成為可能,並提高整個指令碼的一致性。
9.評估運算式時不要使用反引號;請改用$()語法。可以使用:
for file in $(ls); do
反之:
for file in `ls`; do
前一個選項是可巢狀的,更易於閱讀,並使一般的系統管理員感到滿意。不要使用反引號。
8.一致性很好。選擇一種風格併在整個指令碼中堅持下去。顯然,我更喜歡人們在反引號中選擇
()語法,並將其變數放在在花括號中。7.使用適當的shebang作為Bash指令碼。因為我正在編寫Bash指令碼,只打算用Bash執行它們,所以我經常使用#!/ usr / bin / bash作為我的shebang。不要使用#!/ bin / sh或#!/ usr / bin / sh。你的指令碼將執行,但它將以相容樣式執行。可能會產生許多意外的副作用。(當然,除非你想要相容樣式。)
6.比較字串時,在if陳述句中取用變數是個好主意,因為如果你的變數是空的,Bash會為這樣的行丟擲一個錯誤:
if [ ${myvar} == “foo” ]; then
echo “bar”
fi
對於這樣的行,將評估為false:
if [ “${myvar}” == “foo” ]; then
echo “bar”
fi
此外,如果你不確定變數的內容(例如,在解析使用者輸入時),請取用變數以防止解釋某些特殊字元,並確保該變數被視為單個詞,即使它包含空格。
5.我想這是一個品味問題,但我更喜歡使用雙等號(==),即使比較Bash中的字串。這是一致性的問題,儘管,對於字串比較,只有一個等號會起作用,我的考慮立即變為“單個等於是一個賦值運運算元!”
4.使用適當的退出程式碼。確保如果你的指令碼無法執行某些操作,則會向用戶顯示已寫入的失敗訊息(最好透過解決問題的方法)併傳送非零退出程式碼:
# we have failed
echo “Process has failed to complete, you need to manually restart the whatchamacallit”
exit 1
這樣可以更容易地以程式設計方式從另一個指令碼呼叫指令碼並驗證其成功完成。
3.使用Bash的內建機製為變數提供合理的預設值,或者如果未定義你希望定義的變數,則丟擲錯誤:
# this sets the value of $myvar to redhat, and prints ‘redhat’
echo ${myvar:=redhat}
# this throws an error reading ‘The variable myvar is undefined, dear reader’ if $myvar is undefined
${myvar:?The variable myvar is undefined, dear reader}
2.特別是如果你正在編寫大型指令碼,特別是如果你與其他指令碼一起處理該大型指令碼,請考慮在函式內部定義變數時使用local關鍵字。local關鍵字將建立一個區域性變數,該變數只在該函式中可見。這限制了衝突變數的可能性。
1.每個系統管理員有時必須這樣做:在控制臺上除錯一些東西,可以是資料中心的真實伺服器,也可以是虛擬化平臺的虛擬伺服器。如果你必須以這種方式除錯指令碼,你會感謝你自己記住這個:不要讓你的指令碼中的行太長!
在許多系統上,控制檯的預設寬度仍為80個字元。如果你需要在控制臺上除錯指令碼並且該指令碼有很長的行,那麼將是一個悲劇。此外,具有較短行的指令碼,預設值仍為80個字元,在普通編輯器中也更容易閱讀和理解!
●編號574,輸入編號直達本文
●輸入m獲取文章目錄
運維
更多推薦《18個技術類微信公眾號》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。