shell 基礎教程一、shell簡介
文章目錄
前言
使用Linux好幾年了.一直沒有系統的來學過Shell
指令碼,零零散散的學了不少.但是使用的時候總是到處去找資料,所以趁此機會好好的系統的學習一遍Shell指令碼的語法.記錄所學.
參考
- 菜鳥教程: >>點選檢視<<
- C語言中文網:>>點選檢視<<
- Shell 線上工具:>>Shell 線上工具<<
一. 簡介
Linux 是一個開源的作業系統,由分佈在世界各地的多個組織機構或個人共同開發完成,每個組織結構或個人負責一部分功能,最後組合在一起,就構成了今天的 Linux。例如:
Linux
核心最初由芬蘭黑客 Linus Torvalds 開發,後來他組建了團隊,Linux 核心由這個團隊維護。GNU
組織開發了很多核心軟體和基礎庫,例如GCC
編譯器、C語言標準庫
、文字編輯器 Emacs
、程序管理軟體
、Shell
以及GNOME 桌面環境
等。VIM
編輯器由荷蘭人 Bram Moolenaar 開發。
Windows
、Mac OS
、Android
等作業系統不一樣,它們都由一家公司開發,所有的核心軟體和基礎庫都由一家公司做決定,容易形成統一的標準,一般不會開發多款功能類似的軟體。
而 Linux
不一樣,它是“萬國牌”,由多個組織機構開發,不同的組織機構為了發展自己的 Linux 分支可能會開發出功能類似的軟體,它們各有優缺點,使用者可以自由選擇。Shell
Shell 既是一種指令碼程式語言,也是一個連線核心和使用者的軟體。
常見的 Shell 有 sh、bash、csh、tcsh、ash 等。
sh
sh
的全稱是 Bourne shell
,由 AT&T 公司的 Steve Bourne開發,為了紀念他,就用他的名字命名了。
sh 是 UNIX 上的標準 shell,很多 UNIX 版本都配有 sh。sh 是第一個流行的 Shell。
csh
sh 之後另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計的,這個 shell 的語法有點類似C語言,所以才得名為 C shell ,簡稱為 csh
Bill Joy 是一個風雲人物,他創立了 BSD 作業系統,開發了 vi 編輯器,還是 Sun 公司的創始人之一。
BSD 是 UNIX 的一個重要分支,後人在此基礎上發展出了很多現代的作業系統,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就連 Mac OS X 在很大程度上也基於BSD。
tcsh
tcsh 是 csh 的增強版,加入了命令補全功能,提供了更加強大的語法支援。
ash
一個簡單的輕量級的 Shell,佔用資源少,適合運行於低記憶體環境,但是與下面講到的 bash shell 完全相容。
bash
bash shell 是 Linux 的預設 shell,本教程也基於 bash 編寫。
bash 由 GNU 組織開發,保持了對 sh shell 的相容性,是各種 Linux 發行版預設配置的 shell。
bash 相容 sh 意味著,針對 sh 編寫的 Shell 程式碼可以不加修改地在 bash 中執行。
儘管如此,bash 和 sh 還是有一些不同之處:
- 一方面,bash 擴充套件了一些命令和引數;
- 另一方面,bash 並不完全和 sh 相容,它們有些行為並不一致,但在大多數企業運維的情況下區別不大,特殊場景可以使用 bash 代替 sh。
檢視 Shell
Shell 是一個程式,一般都是放在/bin
或者/user/bin
目錄下,當前 Linux 系統可用的 Shell 都記錄在/etc/shells
檔案中。/etc/shells
是一個純文字檔案,你可以在圖形介面下開啟它,也可以使用 cat 命令檢視它。
通過 cat 命令來檢視當前 Linux 系統的可用 Shell:
$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
在現代的 Linux 上,sh 已經被 bash 代替,/bin/sh
往往是指向/bin/bash
的符號連結。
如果你希望檢視當前 Linux 的預設 Shell,那麼可以輸出 SHELL 環境變數:
$ echo $SHELL
/bin/bash
輸出結果表明預設的 Shell
是 bash
。
二、第一個Shell指令碼
開啟文字編輯器(可以使用 vi/vim 命令來建立檔案),新建一個檔案 test.sh,副檔名為 sh(sh代表shell),副檔名並不影響指令碼執行,見名知意就好,如果你用 php 寫 shell 指令碼,副檔名就用 php 好了。
輸入一些程式碼,第一行一般是這樣:
#!/bin/bash
echo "Hello World !"
#!
是一個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種 Shell
。
echo
命令用於向視窗輸出文字。
執行 Shell 指令碼有兩種方法:
- 作為可執行程式
將上面的程式碼儲存為 test.sh,並 cd 到相應目錄:
chmod +x ./test.sh #使指令碼具有執行許可權
./test.sh #執行指令碼
注意,一定要寫成
./test.sh
,而不是test.sh
,執行其它二進位制的程式也一樣,直接寫test.sh
,linux 系統會去PATH
裡尋找有沒有叫test.sh
的,而只有/bin
,/sbin
,/usr/bin
,/usr/sbin
等在PATH
裡,你的當前目錄通常不在PATH
裡,所以寫成test.sh
是會找不到命令的,要用./test.sh
告訴系統說,就在當前目錄找。
- 作為直譯器引數
這種執行方式是,直接執行直譯器,其引數就是 shell 指令碼的檔名,如:
/bin/sh test.sh
/bin/php test.php
這種方式執行的指令碼,不需要在第一行指定直譯器資訊,寫了也沒用。
三、Shell 的提示符
啟動終端模擬包或者從 Linux 控制檯登入後,便可以看到 Shell 提示符。提示符是通往 Shell 的大門,是輸入 Shell 命令的地方。
重點: 對於普通使用者,
Base shell
預設的提示符是美元符號$
;對於超級使用者
(root
使用者),Bash Shell 預設的提示符是井號#
。該符號表示Shell
等待輸入命令。
不同的 Linux 發行版使用的提示符格式不同。例如在 CentOS 中,預設的提示符格式為:
[[email protected] ~]$
這種格式包含了以下三個方面的資訊:
- 啟動 Shell 的使用者名稱,也即 dreamhai;
- 本地主機名稱,也即 localhost;
- 當前目錄,波浪號
~
是主目錄的簡寫表示法。
Shell 通過PS1
和PS2
兩個環境變數來控制提示符格式:
PS1
控制最外層命令列的提示符格式。
PS2
控制第二層命令列的提示符格式。
在 Shell 中初次輸入命令,使用的是 PS1
指定的提示符格式;如果輸入一個命令後還需要輸入附加資訊,Shell 就使用 PS2
指定的提示符格式。請看下面的例子:
[email protected]-desktop:~$ echo "dreamhai"
dreamhai
[email protected]-desktop:~$ echo "dreamhai.com"
dreamhai.com
[email protected]-desktop:~$ echo "
> Dreamhai
> Tan
> Qing
> Hai
> "
Dreamhai
Tan
Qing
Hai
echo
是一個輸出命令,可以用來輸出數字
、變數
、字串
等;本例中,我們使用 echo
來輸出字串。
字串是一組由" "
包圍起來的字元序列,echo 將第一個"
作為字串的開端,將第二個"
作為字串的結尾。此處的字串就可以看做 echo
命令的附加資訊。
本例中,前兩次使用 echo 命令時都是在後面緊跟字串,一行之內輸入了完整的附加資訊。第三次使用 echo 時,將字串分成多行,echo 遇到第一個"
認為是不完整的附加資訊,所以會繼續等待使用者輸入,直到遇見第二個"
。輸入的附加資訊就是第二層命令,所以使用>
作為提示符。
要顯示提示符的當前格式,可以使用 echo 輸出 PS1
和 PS2
:
[email protected]-desktop:~$ echo $PS1
\[\e]0;\[email protected]\h: \w\a\]${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$
[email protected]-desktop:~$ echo $PS2
>
Shell 使用以\
為前導的特殊字元來表示命令提示符中包含的要素,這使得 PS1
和PS2
的格式看起來可能有點奇怪。下表展示了可以在 PS1
和 PS2
中使用的特殊字元。
字元 | 描述 |
---|---|
\a | 鈴聲字元 |
\d | 格式為“日 月 年”的日期 |
\e | ASCII轉義字元 |
\h | 本地主機名 |
\H | 完全合格的限定域主機名 |
\j | shell當前管理的作業數 |
\1 | shell終端裝置名的基本名稱 |
\n | ASCII換行字元 |
\r | ASCII回車 |
\s | shell的名稱 |
\t | 格式為“小時:分鐘:秒”的24小時制的當前時間 |
\T | 格式為“小時:分鐘:秒”的12小時制的當前時間 |
@ | 格式為am/pm的12小時制的當前時間 |
\u | 當前使用者的使用者名稱 |
\v | bash shell的版本 |
\V | bash shell的釋出級別 |
\w | 當前工作目錄 |
\W | 當前工作目錄的基本名稱 |
! | 該命令的bash shell歷史數 |
# | 該命令的命令數量 |
$ | 如果是普通使用者,則為美元符號$;如果超級使用者(root 使用者),則為井號#。 |
\nnn | 對應於八進位制值 nnn 的字元 |
\ | 斜槓 |
[ | 控制碼序列的開頭 |
] | 控制碼序列的結尾 |
注意
所有的特殊字元均以反斜槓\
開頭,目的是與普通字元區分開來。您可以在命令提示符中使用以上任何特殊字元的組合。
我們可以通過修改 PS1 變數來修改提示符格式,例如:
純文字複製
[[email protected] ~]$ PS1="[\t][\u]\$ "
[17:27:34][dreamhai]$
新的 Shell
提示符現在可以顯示當前的時間和使用者名稱。不過這個新定義的 PS1
變數只在當前 Shell 會話期間有效,再次啟動 Shell 時將重新使用預設的提示符格式。