Bash 基本概念

已完成

若要了解 Bash,首先要了解 Bash 語法。 知道語法之後,您就可以將其套用到您執行的每個 Bash 命令。

Bash 命令的完整語法如下:

command [options] [arguments]

Bash 會將其遇到的第一個字串視為命令。 下列命令會使用 Bash 的 ls (代表「列出 (list)」) 命令來顯示目前工作目錄的內容:

ls

Bash 命令通常會伴隨引數。 例如,您可以在 ls 命令中包含路徑名稱,以列出另一個目錄的內容:

ls /etc

大部分的 Bash 命令都有可供修改其運作方式的選項。 選項 (也稱為「旗標」) 可對命令提供更具體的指示。 例如,ls 不會顯示名稱開頭為句號的檔案和目錄,而且使用者也看不到。 不過,您可以在 ls 命令中包含 -a (代表「全部 (all)」) 旗標,並查看目標目錄中的所有項目:

ls -a /etc

您甚至可以合併旗標以求簡潔。 例如,您可改為輸入以下內容,而不要輸入 ls -a -l /etc 來顯示 Linux 的 /etc 目錄中的所有檔案和目錄:

ls -al /etc

Bash 很簡潔。 您可使用單一命令來完成多少工作,有時候很引人注目 (而且是 Bash 迷的驕傲點)。

取得說明

可以使用或必須使用的選項和引數會,因命令而有所不同。 幸好,Bash 文件已內建在作業系統中。 說明絕對不會超過命令。 若要了解命令的選項,請使用 man (代表「手動 (manual)」) 命令。 比方說,若要查看 mkdir (「產生目錄 (make directory)」) 命令的所有選項,請執行下列動作:

man mkdir

man 會是您當學習 Bash 時的最佳朋友。 man 是您如何找到了解任何命令運作方式所需的資訊。

大部分的 Bash 和 Linux 命令都支援 --help 選項。 這會顯示命令的語法和選項描述。 若要示範,請輸入 mkdir --help。 輸出會如下所示:

Usage: mkdir [OPTION]... DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.
    
Mandatory arguments to long options are mandatory for short options too.
  -m, --mode=MODE   set file mode (as in chmod), not a=rwx - umask
  -p, --parents     no error if existing, make parent directories as needed
  -v, --verbose     print a message for each created directory
  -Z                   set SELinux security context of each created directory
                         to the default type
      --context[=CTX]  like -Z, or if CTX is specified then set the SELinux
                         or SMACK security context to CTX
      --help     display this help and exit
      --version  output version information and exit
    
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report mkdir translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/mkdir>
or available locally via: info '(coreutils) mkdir invocation'

以這種方式取得的說明,通常比使用 man 取得的協助更為簡潔。

使用萬用字元

萬用字元是 Bash 命令中代表一或多個字元的符號。 最常使用的萬用字元是星號。 其代表零個字元或一連串的字元。 假設您目前的目錄包含數百個影像檔案,但您只想查看 PNG 檔案,也就是檔案名以 .png 結尾的檔案。 以下是只會列出那些檔案的命令:

ls *.png

注意

Linux 沒有像其他作業系統一樣的正式副檔名概念。 這並不表示 PNG 檔案不會有 .png 副檔名。 這僅只表示 Linux 不會對檔案名稱以 .png 結尾的這個事實,附加任何特殊的重要性。

現在假設目前的目錄也包含 JPEG 檔案。 有些以 .jpg 結尾,而其他則以 .jpeg. 結尾。以下是列出所有 JPEG 檔案的其中一種方式:

ls *.jpg *.jpeg

以下是另一個範例:

ls *.jp*g

* 萬用字元符合零個或多個字元,但 ? 萬用字元代表單一字元。 如果目前目錄包含名為 0001.jpg0002.jpg (依此類推到 0009.jpg) 的檔案,則下列命令會列出所有這些檔案:

ls 000?.jpg

另一個使用萬用字元來篩選輸出的方法,就是使用方括弧,其代表字元群組。 下列命令會列出目前目錄中名稱包含一個句點且後面緊接著小寫 J 或 P 的所有檔案。其會列出所有 .jpg.jpeg.png 檔案,但不會列出 .gif 檔案:

ls *.[jp]*

在 Linux 中,檔案名稱和在其上操作的命令會區分大小寫。 因此,若要列出目前目錄中名稱包含一個句點且後面接著大寫「或」小寫 J 或 P 的所有檔案,您可以輸入:

ls *.[jpJP]*

以方括弧括住的運算式可代表字元範圍。 例如,下列命令會列出目前目錄中名稱以小寫字母開頭的所有檔案:

ls [a-z]*

相比之下,此命令會列出目前目錄中名稱以大寫字母開頭的所有檔案:

ls [A-Z]*

而這個命令會列出目前目錄中名稱以小寫「或」大寫字母開頭的所有檔案:

ls [a-zA-Z]*

根據這一點,您可以猜出下列命令將會執行哪些動作?

ls [0-9]*
ls *[0-9]*
ls *[0-9]

如果您需要使用其中一個萬用字元作為一般字元,請將其設為常值,或在其前面加上反斜線「予以逸出」。 因此,如果基於某些原因,您的檔案名稱有一個星號 (您絕對不該刻意執行的動作),您可以使用如下所示的命令進行搜尋:

$ ls *\**