0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Bash指南:Bash最佳實踐

Linux愛好者 ? 來源:未知 ? 作者:李倩 ? 2018-08-21 17:29 ? 次閱讀

每個行業(yè)都有一個該行業(yè)的大師們最常使用的工具。 對于許多系統(tǒng)管理員來說,這個工具就是他們的shell。 在大多數(shù) Linux 和其他類 Unix 系統(tǒng)上,默認(rèn)的 shell 是 Bash。

Bash 是一個相當(dāng)古老的程序——它起源于 20 世紀(jì) 80 年代后期——但它建立在更多更老的 shell 上,比如 C shell(csh),csh 至少是它 10 年前的前輩了。 因為 shell 的概念是那么古老,所以有大量的神秘知識等待著系統(tǒng)管理員去吸收領(lǐng)悟,使其生活更輕松。

我們來看看一些基礎(chǔ)知識。

在某些時候,誰曾經(jīng)無意中以 root 身份運行命令并導(dǎo)致某種問題?舉手

我很確定我們很多人一度都是那個人。 這很痛苦。 這里有一些非常簡單的技巧可以防止你再次碰上這類問題。

使用別名

首先,為mv和rm等命令設(shè)置別名,指向mv -i和rm -i。 這將確保在運行rm -f /boot時至少需要你確認(rèn)。 在 Red Hat 企業(yè)版 Linux 中,如果你使用 root 帳戶,則默認(rèn)設(shè)置這些別名。

如果你還要為普通用戶帳戶設(shè)置這些別名,只需將這兩行放入家目錄下名為.bashrc的文件中(這些也適用于sudo):

alias mv='mv -i'

alias rm='rm -i'

讓你的 root 提示符脫穎而出

你可以采取的防止意外發(fā)生的另一項措施是確保你很清楚在使用 root 帳戶。 在日常工作中,我通常會讓 root 提示符從日常使用的提示符中脫穎而出。

如果將以下內(nèi)容放入 root 的家目錄中的 .bashrc 文件中,你將看到一個黑色背景上的紅色的 root 提示符,清楚地表明你(或其他任何人)應(yīng)該謹(jǐn)慎行事。

export PS1="[$(tput bold)$(tput setab 0)$(tput setaf 1)]u@h:w # [$(tput sgr0)]"

實際上,你應(yīng)該盡可能避免以 root 用戶身份登錄,而是通過 sudo 運行大多數(shù)系統(tǒng)管理命令,但這是另一回事。

使用了一些小技巧用于防止使用 root 帳戶時的“不小心的副作用”之后,讓我們看看 Bash 可以幫助你在日常工作中做的一些好事。

控制你的歷史

你可能知道在 Bash 中你按向上的箭頭時能看見和重新使用你之前所有(好吧,大多數(shù))的命令。這是因為這些命令已經(jīng)保存到了你家目錄下的名為 .bash_history 的文件中。這個歷史文件附帶了一組有用的設(shè)置和命令。

首先,你可以通過鍵入 history 來查看整個最近的命令歷史記錄,或者你可以通過鍵入 history 30 將其限制為最近 30 個命令。不過這技巧太平淡無奇了(LCTT 譯注: vanilla 原為香草,后引申沒拓展的、標(biāo)準(zhǔn)、普通的,比如 vanilla C++ compiler 意為標(biāo)準(zhǔn) C++ 編譯器)。 你可以更好地控制 Bash 保存的內(nèi)容以及保存方式。

例如,如果將以下內(nèi)容添加到 .bashrc,那么任何以空格開頭的命令都不會保存到歷史記錄列表中:

HISTCONTROL=ignorespace

如果你需要以明文形式將密碼傳遞給一個命令,這就非常有用。 (是的,這太可怕了,但它仍然會發(fā)生。)

如果你不希望經(jīng)常執(zhí)行的命令充斥在歷史記錄中,請使用:

HISTCONTROL=ignorespace:erasedups

這樣,每次使用一個命令時,都會從歷史記錄文件中刪除之前出現(xiàn)的所有相同命令,并且只將最后一次調(diào)用保存到歷史記錄列表中。

我特別喜歡的歷史記錄設(shè)置是 HISTTIMEFORMAT 設(shè)置。 這將在歷史記錄文件中在所有的條目前面添加上時間戳。 例如,我使用:

HISTTIMEFORMAT="%F %T "

當(dāng)我輸入 history 5 時,我得到了很好的完整信息,如下所示:

這使我更容易瀏覽我的命令歷史記錄并找到我兩天前用來建立到我家實驗室的 SSH 連接(我一次又一次地忘記……)。

Bash 最佳實踐

我將在編寫 Bash 腳本時最好的(或者至少是好的,我不要求無所不知)11 項實踐列出來。

11、 Bash 腳本可能變得復(fù)雜,不過注釋也很方便。 如果你在考慮是否要添加注釋,那就添加一個注釋。 如果你在周末之后回來并且不得不花時間搞清楚你上周五想要做什么,那你是忘了添加注釋。

10、 用花括號括起所有變量名,比如 ${myvariable}。 養(yǎng)成這個習(xí)慣可以使用 ${variable}_suffix 這種用法了,還能提高整個腳本的一致性。

9、 計算表達(dá)式時不要使用反引號;請改用 $() 語法。 所以使用:

forfile in$(ls);do

而不使用:

forfile in`ls`;do

前一個方式是可嵌套的,更易于閱讀的,還能讓一般的系統(tǒng)管理員群體感到滿意。 不要使用反引號。

8、 一致性是好的。 選擇一種風(fēng)格并在整個腳本中堅持下去。 顯然,我喜歡人們選擇 $() 語法而不是反引號,并將其變量包在花括號中。 我更喜歡人們使用兩個或四個空格而不是制表符來縮進(jìn),但即使你選擇了錯誤的方式,也要一貫地錯下去。

7、 為 Bash 腳本使用適當(dāng)?shù)尼尠閟hebang(LCTT 譯注:Shebang,也稱為 Hashbang ,是一個由井號和嘆號構(gòu)成的字符序列 #! ,其出現(xiàn)在文本文件的第一行的前兩個字符。 在文件中存在釋伴的情況下,類 Unix 操作系統(tǒng)的程序載入器會分析釋伴后的內(nèi)容,將這些內(nèi)容作為解釋器指令,并調(diào)用該指令,并將載有釋伴的文件路徑作為該解釋器的參數(shù))。 因為我正在編寫B(tài)ash腳本,只打算用 Bash 執(zhí)行它們,所以我經(jīng)常使用 #!/usr/bin/bash 作為我的釋伴。 不要使用 #!/bin/sh 或 #!/usr/bin/sh。 你的腳本會被執(zhí)行,但它會以兼容模式運行——可能會產(chǎn)生許多意外的副作用。 (當(dāng)然,除非你想要兼容模式。)

6、 比較字符串時,在 if 語句中給變量加上引號是個好主意,因為如果你的變量是空的,Bash 會為這樣的行拋出一個錯誤:

if[${myvar} == "foo"];then

echo"bar"

fi

對于這樣的行,將判定為 false:

if["${myvar}" == "foo"];then

echo"bar"

fi

此外,如果你不確定變量的內(nèi)容(例如,在解析用戶輸入時),請給變量加引號以防止解釋某些特殊字符,并確保該變量被視為單個單詞,即使它包含空格。

5、 我想這是一個品味問題,但我更喜歡使用雙等號( == ),即使是比較 Bash 中的字符串。 這是一致性的問題,盡管對于字符串比較,只有一個等號會起作用,我的思維立即變?yōu)椤皢蝹€ = 是一個賦值運算符!”

4、 使用適當(dāng)?shù)耐顺龃a。 確保如果你的腳本無法執(zhí)行某些操作,則會向用戶顯示已寫好的失敗消息(最好提供解決問題的方法)并發(fā)送非零退出代碼:

# we have failed

echo"Process has failed to complete, you need to manually restart the whatchamacallit"

exit1

這樣可以更容易地以編程方式從另一個腳本調(diào)用你的腳本并驗證其成功完成。

3、 使用 Bash 的內(nèi)置機制為變量提供合理的默認(rèn)值,或者如果未定義你希望定義的變量,則拋出錯誤:

# 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 isundefined,dear reader}

2、 特別是如果你正在編寫大型腳本,或者是如果你與其他人一起開發(fā)該大型腳本,請考慮在函數(shù)內(nèi)部定義變量時使用 local 關(guān)鍵字。 local 關(guān)鍵字將創(chuàng)建一個局部變量,該變量只在該函數(shù)中可見。 這限制了變量沖突的可能性。

1、 每個系統(tǒng)管理員有時必須這樣做:在控制臺上調(diào)試一些東西,可能是數(shù)據(jù)中心的真實服務(wù)器,也可能是虛擬化平臺的虛擬服務(wù)器。 如果你必須以這種方式調(diào)試腳本,你會感謝你自己記住了這個:不要讓你的腳本中的行太長!

在許多系統(tǒng)上,控制臺的默認(rèn)寬度仍為 80 個字符。 如果你需要在控制臺上調(diào)試腳本并且該腳本有很長的行,那么你將成為一個悲傷的熊貓。 此外,具有較短行的腳本—— 默認(rèn)值仍為 80 個字符——在普通編輯器中也更容易閱讀和理解!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11310

    瀏覽量

    209626
  • Bash
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    10187

原文標(biāo)題:面向系統(tǒng)管理員的 Bash 指南

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    詳解Linux Bash命令

    Bash 是一種相當(dāng)強大的編程語言,而且也很容易上手。
    發(fā)表于 08-15 09:12 ?1621次閱讀

    開發(fā)人員必須具備的Bash腳本知識

    您可以使用 Bash 腳本自動執(zhí)行各種任務(wù)。掌握基礎(chǔ)知識并開始您的 Bash 腳本之旅。
    發(fā)表于 09-27 09:09 ?430次閱讀

    如何在bash shell腳本中使用變量

    如果你使用編程語言編寫過程序,那么一定接觸過變量。而在 bash 腳本的編寫時,變量也是一個很重要的概念。今天我們分享一下如何在 bash 腳本中使用變量。
    發(fā)表于 12-02 16:32 ?2117次閱讀
    如何在<b class='flag-5'>bash</b> shell腳本中使用變量

    如何在bash中使用條件語句

    今天我們介紹一下如何在 bash 中使用條件語句。
    的頭像 發(fā)表于 12-09 17:27 ?2158次閱讀
    如何在<b class='flag-5'>bash</b>中使用條件語句

    bash高級編程相關(guān)資料下載

    電子發(fā)燒友網(wǎng)站提供《bash高級編程相關(guān)資料下載.pdf》資料免費下載
    發(fā)表于 04-25 10:17 ?3次下載

    高級Bash 腳本編程指南

    高級Bash 腳本編程指南
    發(fā)表于 10-26 08:33 ?7次下載
    高級<b class='flag-5'>Bash</b> 腳本編程<b class='flag-5'>指南</b>

    10個方便的Bash別名

    要使用你創(chuàng)建的 Bash 別名,你需要將其添加到 .bash_profile 中,該文件位于你的家目錄中。請注意,此文件是隱藏的,并只能從命令行訪問。編輯此文件的最簡單方法是使用 Vi 或 Nano 之類的東西。
    的頭像 發(fā)表于 10-16 15:00 ?2735次閱讀

    BASH19 高壓開關(guān)二極管系列 + 175°C

    電子發(fā)燒友網(wǎng)為你提供ON Semiconductor(ti)BASH19相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊,更有BASH19的引腳圖、接線圖、封裝手冊、中文資料、英文資料,BASH19真值表,BASH
    發(fā)表于 08-04 21:02

    使用Bash處理變量的常見錯誤

    Linux 中的 Bash 腳本語言支持對變量的操作。但是,如果您從事過其他流行的編程語言開發(fā),那么使用 Bash 處理變量會很容易出錯。因為它的語法與其他語法不同(甚至對某些開發(fā)人員來說有點奇怪)。
    的頭像 發(fā)表于 05-13 15:52 ?1374次閱讀

    bash手冊

    本文簡要介紹了bashshell(版本:5.12020年12月21日)。這是GNU Bash參考手冊第5.1版,最后一次更新于2020年12月21日,對于Bash,版本5.1。
    發(fā)表于 08-04 17:45 ?3次下載

    Bash 中比較 $() 與 ${}

    像 Linux 這樣的基于 GNU 的操作系統(tǒng)依賴于一個名為 Bash 的命令語言解釋器或 Shell 來完成它們的大部分計算任務(wù)和目標(biāo)。
    的頭像 發(fā)表于 09-09 09:24 ?681次閱讀

    bash腳本中的循環(huán)功能

    循環(huán)是 bash 腳本中一個很重要的功能,用途廣泛。本篇文章我們介紹三種不同的循環(huán),然后利用循環(huán)遍歷數(shù)組。
    的頭像 發(fā)表于 12-14 17:30 ?3616次閱讀

    Bash腳本中特殊變量$0是什么?

    Bash 腳本中,`$0` 是一個特殊變量,它代表當(dāng)前腳本的路徑和名稱。這個變量用于表示腳本自身,它是 Bash 環(huán)境中的一個重要組成部分。`$0` 變量是一個只讀變量,無法更改。
    的頭像 發(fā)表于 05-12 14:41 ?1851次閱讀

    BASH shell腳本篇—條件命令

    這篇文章介紹下BASH shell中的條件相關(guān)的命令,包括:if, case, while, until, for, break, continue。
    的頭像 發(fā)表于 10-11 15:21 ?633次閱讀
    <b class='flag-5'>BASH</b> shell腳本篇—條件命令

    BASH shell腳本篇—函數(shù)

    函數(shù)是代碼重用的最重要方式。Bash函數(shù)可以定義為一組命令,在bash腳本中多次調(diào)用。
    的頭像 發(fā)表于 10-20 16:31 ?1118次閱讀