學習bash編程時,應該養成哪些好的習慣?

你覺得有哪些代碼風格的最佳實踐是需要掌握的呢?


我覺得題主非常好,知道主動學習Bash裡面的一些注意事項,而不是等待犯錯以後再來學習,就這一點來說,已經比很多工程師強了。大家都還記得今年上半年國外的一個雲計算工作,批量執行rm -rf /把用戶的數據刪掉的慘案嗎?一個錯誤毀掉一個公司。[轉]一個命令rm-rf/ ,他把整個公司刪沒了…


犯錯誤的工程師當然不是故意的,不會自己去執行rm -rf,這是由於執行rm -rf /$dir的時候,由於$dir是空,所以就變成了rm -rf /。對於這個問題,我們應該先判斷目錄是否存在,然後再刪除,如下所示:


test -e /ebs rm -rf /ebs

如果你寫shell腳本的時候不注意,就免不了犯這樣的錯誤。Bash中還有很多類似的坑等著大家。

既然題主誠心誠意的發問了,那我就不藏著掖著了,給大家推薦:bash Pitfalls(BashPitfalls)


Bash Pitfalls介紹了40多條日常Bash編程中,老手和新手都容易忽略的錯誤編程習慣。 每條作者在給出錯誤的範例上,詳細分析與解釋錯誤的原因,同時給出正確的改寫建議。已經有朋友(網名:糰子)將這篇文章翻譯成了中文版。


希望對大家有幫助,謝謝。


對於shell腳本感興趣的同學,推薦看我這個回答下的學習材料推薦:學習 shell 有什麼好書推薦? - 知乎用戶的回答


  • 不要花太多時間在bash上,有研究bash技巧的功夫,早就用其他腳本語言搞定你的需求了
  • 花點時間粗略翻一下APUE,知道進程的概念,會避免很多常見錯誤
  • 不要花太多時間在bash上。

不談玄學了。

提供幾個工具吧,有的可能需要點技巧才能進去,畢竟時期特殊。

  1. Bash Programming - Introduction HOW-TO:這個教程是入門級,很適合新人看,不過比較老了。
  2. Advanced Bash-Scripting Guide:這個就要深入一些了。如果你想深入了解Bash的話可以在完成其他一些比較簡單的教程以後在來閱讀這個。
  3. Learn Bash In Y Minutes:一個非常簡短的教程,適合快速上手。
  4. BASH Frequently Asked Questions:這篇文章不是教程類型的,你可以在稍微熟悉了Bash的基本使用以後來看看,都是Bash使用過程中的一些常見的問題。這個適合於你放在收藏中,以備不時之需,常來參考。
  5. Linux Shell Scripting Tutorial:適合新人學習的教程,專註於Linux。
  6. Bash Hacker Wiki:關於Bash的Wiki,有很多不錯的例子。
  7. Bash -- Standard Shell:簡短的教程,讀起來比第一個要舒服。
  8. Bash by Examples Part I, II and III:按照常見使用場景進行說明的教程,很實用。
  9. Bash Guide for Beginners:2008年的教程了。
  10. Unix Shells: Bash vs Fish vs Ksh vs Tcsh vs Zsh:不同的shell之間的對比。
  11. General coding style guide:讓你的程序更加可讀的建議。
  12. Better bash scripting in 15 minutes:同樣是建議性的,開始上手編寫自己的Bash腳本前可以看看。
  13. Defensive bash programming:讓你的程序更加穩健。

你想更深入了解學習Linux知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:

【超全整理】《Linux雲計算從入門到精通》系列實戰筆記全放送


閱讀發行版自帶的那些sysV啟動腳本,包括他們一般會載入的functions文件的內容。學他們就好了。


不知道為什麼這個有點老的問題被推送到我的首頁了,想寫好 Bash-Shell 真的蠻難得的。因為一般很多軟體的 shell 腳本都是很不規範的「將就」作品。畢竟 shell 其惡劣程度實在令人髮指。
不過想寫好 shell 也不是那麼容易的,寫好 shell 有一個必備的東西叫 "shellcheck"。

GitHub - koalaman/shellcheck 是一個shell 的靜態分析工具,能給出警告和建議。它有一份龐大的規範。

例如:

# 輸出一個變數
echo $var
# 或者
echo ${var}

但是規範 SC2086 告訴你應該這樣

echo "$var"

目的是 防止被當做通配符或被分詞。

規範 SC1014 要求你沒事別用 [...] 中括弧。
例如

if [ grep -q pattern file ]
then
echo "匹配到結果"
fi

應該這樣

if grep -q pattern file
then
echo "匹配到結果"
fi

因為中括弧並不是 shell 的語法,不應該包括要被測試的語句。

這些在 shellcheck 的 wiki 上都有:https://github.com/koalaman/shellcheck/wiki

如果想寫"標準" shell ,推薦用 vscode 加上 shellcheck 擴展。

至於能不能完全脫離 shell 呢,答案是不能。所以找幾個自己喜歡的規範遵守一下寫寫吧。


只要這一本即可:
Advanced Bash-Scripting Guide


先自答下,從上面的回答里了解到APUE這本書也許要讀下,另外Google了幾個bash coding style,下面這個貌似是最簡明易懂的適合新手的..
bahamas10/bash-style-guide · GitHub


會些基本的bash就好,sed/awk/expect也不要搞了,有時間搞搞perl/python(其實我想說統一切換成),當然你喜歡用ruby也行,看應用場景。


我來說個吧 變數要加花括弧


根據你問的問題,我猜測你可能是運維或者測試,我覺得必要的代碼風格是開頭注釋整個腳本什麼功能,維護人和時間以及變更信息說明,在每個函數給出必要的解釋,這樣為了後面接受的人更快的接手你的代碼。
說句體外的話,我認為在運維日常工作中,bash是必須要會的,它畢竟是跟直接和內核打交道的,一些簡單的操作使用它相當方便比如文本的處理,使用合適的工具會給我們帶來很大的方便,bash適合內部數據處理,側重文本,而python更適合大型運算、通用的腳本開發跨平台。這兩種語言我覺得都是需要學習的,根據不同的場景使用不同的語言,更快的完成任務,節省自己的時間。
三劍客也是要會的,可以幫我們解決很多問題,一條命令搞定,可以看看UNIX shell範例精講(第四版)講的很細,至於python可以看看Learn Python the hard way這本經典的入門書。


Google Shell 編程風格指南


就是能不寫BASH就不寫BASH


把apue和unix痛恨者手冊各看一遍, 至少要看痛恨者手冊

開頭寫上
set -ue
set -o pipefail

調試用bash -x


學一門其他語言,bash只會基礎的就好,太難用了


寫一次不容易,能復用的盡量復用


man


學會偷懶。比如你想給一批文件重命名時,你可以寫個shell。肯定省時省力。


推薦閱讀:

用 SSH 登錄伺服器用 Vim 在線寫 PHP 代碼的體驗是怎樣的?
Google 的 Android 為什麼不自主開發一個內核而要用 Linux 內核?
一個新手面試 Linux 運維工作至少需要知道哪些知識?
linux/unix socket編程並發時什麼時候用進程(fork),什麼時候用線程(池)?
ssh遠程登陸有時候正常,有時候顯示:ssh_exchange_identification: Connection closed by remote host,這是什麼原因?

TAG:編程 | Linux | 計算機 | 運維 | 編程入門 |