天天看點

20天入門Shell之Day2 基本用法

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 會顯示所有選項,讓你選擇。