前言:之前寫過一篇介紹Linux系統(tǒng)基本技能的文章,文章的最后放了一張基本操作的思維導圖,把這張圖掌握了,就能像使用wins系統(tǒng)一樣使用linux系統(tǒng)了。
青山屋主:生信自學之linux操作基礎?zhuanlan.zhihu.com

這之后需要學什么呢?需要繼續(xù)學習寫shell腳本,用腳本來處理數(shù)量龐大的且重復性高的工作。本系列就從shell和bash的介紹開始,教大家如何用把shell命令寫成可以重復使用的腳本。
說明:本文是對Vamei知乎文章Vamei:快速學習Bash一文的學習筆記,根據(jù)個人理解調整了內容順序,補充了一些注釋和說明等內容。
1. shell和bash
shell是運行在終端中的文本互動程序,bash(GNU Bourne-Again Shell)是最常用的一種shell。是當前大多數(shù)Linux發(fā)行版的默認Shell。
Shell相當于是一個翻譯,把我們在計算機上的操作或我們的命令,翻譯為計算機可識別的二進制命令,傳遞給內核,以便調用計算機硬件執(zhí)行相關的操作;同時,計算機執(zhí)行完命令后,再通過Shell翻譯成自然語言,呈現(xiàn)在我們面前。

其他的shell還有:sh、bash、ksh、rsh、csh等。Ubuntu系統(tǒng)常用的是bash,Bio-linux系統(tǒng)是基于ubuntu定制的,但是卻使用了zsh。
sh的全名是Bourne Shell。名字中的玻恩就是這個Shell的作者。
而bash的全名是Bourne Again Shell。最開始在Unix系統(tǒng)中流行的是sh,而bash作為sh的改進版本,提供了更加豐富的功能。一般來說,都推薦使用bash作為默認的Shell。
如何查看當前系統(tǒng)中shell的類型?
echo $SHELL
2. shell命令
shell命令可以分為以下三類:
內建函數(shù)(built-in function):shell自帶的功能
可執(zhí)行文件(executable file):保存在shell之外的腳本,提供了額外的功能。
別名(alias):給某個命令的簡稱
shell的內建函數(shù)是自帶的預先寫好的,實現(xiàn)一定功能的程序。
可執(zhí)行文件是shell之外的腳本,提供了使用者自定義的功能。Shell必須在系統(tǒng)中找到對應命令名的可執(zhí)行文件,才能正確執(zhí)行。我們可以用絕對路徑來告訴Shell可執(zhí)行文件所在的位置。如果用戶只是給出了命令名,而沒有給出準確的位置,那么Shell必須自行搜索一些特殊的位置,也就是所謂的默認路徑。Shell會執(zhí)行第一個名字和命令名相同的可執(zhí)行文件。我們可以通過which命令,來確定命令名對應的是哪個可執(zhí)行文件:
which datewhich pwd? #以上兩個命令分別返回date和pwd命令對應的可執(zhí)行文件的絕對路徑
別名是給某個命令一個簡稱,以后在Shell中就可以通過這個簡稱來調用對應的命令。在Shell中,我們可以用alias來定義別名:
alias freak=“free -h”
可以用alias將一些常用的命令進行簡化,比如“l(fā)s -l”簡化為“l(fā)l”
如何了解命令的類型?
type datetype pwd#可以用type命令查看命令類型。如果是內建函數(shù)會返回builtin字樣,如果是可執(zhí)行文件,將返回文件的路徑
3. 命令的選項和參數(shù)
我們已經(jīng)看到,一行命令里還可以包含著選項和參數(shù)??偟膩碚f,選項用于控制命令的行為,而參數(shù)說明了命令的作用對象。
比如說uname命令,該命令的主要功能是輸出系統(tǒng)信息。它有很多個選項,不同的選項指定輸出不同想系統(tǒng)信息。
uname --help
Usage:uname [OPTION]...
print certain system information. with no OPTION, same as -s.
-a,--all? ? ? ? ? ? ? print all informationin the follow order,except omit -p and -i if unknown
-s,--kernel-name? ? ? print the kernel name
-n,--nodename? ? ? ? ? print the network node hostname
-r,--kernel-release? ? print the kernel release
-v,--kernel-version? ? print the kernel version
-m,--machine? ? ? ? ? print the machin hardware name
-p,--processor? ? ? ? print the processor type or "unknown"
-i,--hardware-platform print the hardware platform or "unknown"
-o,--operating-system? print the operating system
--help? ? ? ? ? ? ? display this help and exit
--version? ? ? ? ? output version information and exit
....
上面例子中短橫引領的字母叫短選項,雙短橫引領的單詞叫長選項,對應的短選項等價于長選項。比如“uname -s”等價于“uname --kenel-name”。
多個短選項的字母可以合在一起,跟在同一個"-"后面。比如,下面的兩個命令就等價:
uname -m -r uname -mr
一個命令可能有非常多的選項,要弄清楚它們的用法還需要閱讀相應的幫助文檔。一般情況下是該命令后加“-h”選項,或者是加"--help"選項。
參數(shù)說明了命令的作用對象。就拿echo這個命令來說,它能把字符打印到終端。它選擇打印的對象,正是它的參數(shù):
echo hello
有的時候,選項也會攜帶變量,以便來說明選項行為的原材料。比如:
sudo date --set="1999-01-01 08:00:00"
date是參數(shù),選項"--set"用于設置時間,用等號連接的,就是它的參數(shù)。date會把日期設置成這一變量所代表的日期。如果用短選項,那么就要用空格取代等號了:
sudo date -s "1999-01-01 08:00:00"
值得注意的是,Shell對空格敏感。當一整個參數(shù)信息中包含了空格時,我們需要用引號把參數(shù)包裹起來,以便Shell能識別出這是一個整體。
更多內容請移步青山屋主的知乎專欄:https://zhuanlan.zhihu.com/c_67761129