2.1 echo指令
由于後面的例子會大量用到echo指令,這裡先介紹這個指令。
echo指令的作用是在螢幕輸出一行文本,可以将該指令的參數原樣輸出。
$ echo hello world
hello world
上面例子中,echo的參數是hello world,可以原樣輸出。
如果想要輸出的是多行文本,即包括換行符。這時就需要把多行文本放在引号裡面。
$ echo "
abc
123"
上面例子中,echo可以原樣輸出多行文本。
2.1.1 echo -n參數
預設情況下,echo輸出的文本末尾會有一個回車符。-n參數可以取消末尾的回車符,使得下一個提示符緊跟在輸出内容的後面。
$ echo -n hello world
hello world$
上面例子中,world後面直接就是下一行的提示符$。
$ echo a;echo b
a
b
$ echo -n a;echo b
ab
上面例子中,-n參數可以讓兩個echo指令的輸出連在一起,出現在同一行。
2.1.2 echo -e參數
-e參數會解釋引号(雙引号和單引号)裡面的特殊字元(比如換行符\n)。如果不使用-e參數,即預設情況下,引号會讓特殊字元變成普通字元,echo不解釋它們,原樣輸出。
$ echo "Hello\nWorld"
Hello\nWorld
# 雙引号的情況
$ echo -e "Hello\nWorld"
Hello
World
# 單引号的情況
$ echo -e 'Hello\nWorld'
Hello
World
上面代碼中,-e參數使得\n解釋為換行符,導緻輸出内容裡面出現換行。
2.2 指令格式
指令行環境中,主要通過使用 Shell 指令,進行各種操作。Shell 指令基本都是下面的格式。
$ command [ arg1 ... [ argN ]]
上面代碼中,command是具體的指令或者一個可執行檔案,arg1 ... argN是傳遞給指令的參數,它們是可選的。
$ ls -l
上面這個指令中,ls是指令,-l是參數。
有些參數是指令的配置項,這些配置項一般都以一個連詞線開頭,比如上面的-l。同一個配置項往往有長和短兩種形式,比如-l是短形式,--list是長形式,它們的作用完全相同。短形式便于手動輸入,長形式一般用在腳本之中,可讀性更好,利于解釋自身的含義。
# 短形式
$ ls -r
# 長形式
$ ls --reverse
上面指令中,-r是短形式,--reverse是長形式,作用完全一樣。前者便于輸入,後者便于了解。
Bash 單個指令一般都是一行,使用者按下Enter鍵,就開始執行。有些指令比較長,寫成多行會有利于閱讀和編輯,這時可以在每一行的結尾加上反斜杠,Bash 就會将下一行跟目前行放在一起解釋。
$ echo foo bar
# 等同于
$ echo foo \
bar
2.3 空格
Bash 使用空格(或 Tab 鍵)區分不同的參數。
$ command foo bar
上面指令中,foo和bar之間有一個空格,是以 Bash 認為它們是兩個參數。
如果參數之間有多個空格,Bash 會自動忽略多餘的空格。
$ echo this is a test
this is a test
上面指令中,a和test之間有多個空格,Bash 會忽略多餘的空格。
2.4 分号
分号(;)是指令的結束符,使得一行可以放置多個指令,上一個指令執行結束後,再執行第二個指令。
$ clear; ls
上面例子中,Bash 先執行clear指令,執行完成後,再執行ls指令。
注意,使用分号時,第二個指令總是接着第一個指令執行,不管第一個指令執行成功或失敗。
2.5 指令組合符 &&和||
除了分号,Bash 還提供兩個指令組合符&&和||,允許更好地控制多個指令之間的繼發關系。
Command1 && Command2
上面指令的意思是,如果Command1指令運作成功,則繼續運作Command2指令。
Command1 || Command2
上面指令的意思是,如果Command1指令運作失敗,則繼續運作Command2指令。
下面是一些例子。
$ cat filelist.txt ; ls -l filelist.txt
上面例子中,隻要cat指令執行結束,不管成功或失敗,都會繼續執行ls指令。
$ cat filelist.txt && ls -l filelist.txt
上面例子中,隻有cat指令執行成功,才會繼續執行ls指令。如果cat執行失敗(比如不存在檔案flielist.txt),那麼ls指令就不會執行。
$ mkdir foo || mkdir bar
上面例子中,隻有mkdir foo指令執行失敗(比如foo目錄已經存在),才會繼續執行mkdir bar指令。如果mkdir foo指令執行成功,就不會建立bar目錄了。
2.6 type指令
Bash 本身内置了很多指令,同時也可以執行外部程式。怎麼知道一個指令是内置指令,還是外部程式呢?
type指令用來判斷指令的來源。
$ type echo
echo is a shell builtin
$ type ls
ls is hashed (/bin/ls)
上面代碼中,type指令告訴我們,echo是内部指令,ls是外部程式(/bin/ls)。
type指令本身也是内置指令。
$ type type
type is a shell builtin
如果要檢視一個指令的所有定義,可以使用type指令的-a參數。
$ type -a echo
echo is shell builtin
echo is /usr/bin/echo
echo is /bin/echo
上面代碼表示,echo指令既是内置指令,也有對應的外部程式。
type指令的-t參數,可以傳回一個指令的類型:别名(alias),關鍵詞(keyword),函數(function),内置指令(builtin)和檔案(file)。
$ type -t bash
file
$ type -t if
keyword
上面例子中,bash是檔案,if是關鍵詞。
2.7 快捷鍵
Bash 提供很多快捷鍵,可以大大友善操作。下面是一些最常用的快捷鍵,完整的介紹參見《行操作》一章。
- lCtrl + L:清除螢幕并将目前行移到頁面頂部。
- Ctrl + C:中止目前正在執行的指令。
- Shift + PageUp:向上滾動。
- Shift + PageDown:向下滾動。
- Ctrl + U:從光标位置删除到行首。
- Ctrl + K:從光标位置删除到行尾。
- Ctrl + W:删除光标位置前一個單詞。
- Ctrl + D:關閉 Shell 會話。
- ↑,↓:浏覽已執行指令的曆史記錄。
除了上面的快捷鍵,Bash 還具有自動補全功能。指令輸入到一半的時候,可以按下 Tab 鍵,Bash 會自動完成剩下的部分。比如,輸入tou,然後按一下 Tab 鍵,Bash 會自動補上ch。
除了指令的自動補全,Bash 還支援路徑的自動補全。有時,需要輸入很長的路徑,這時隻需要輸入前面的部分,然後按下 Tab 鍵,就會自動補全後面的部分。如果有多個可能的選擇,按兩次 Tab 鍵,Bash 會顯示所有選項,讓你選擇。