1. 程式人生 > 其它 >shell 基礎教程一、shell簡介

shell 基礎教程一、shell簡介

技術標籤:# shell技術棧shelllinux

文章目錄

前言

使用Linux好幾年了.一直沒有系統的來學過Shell指令碼,零零散散的學了不少.但是使用的時候總是到處去找資料,所以趁此機會好好的系統的學習一遍Shell指令碼的語法.記錄所學.

參考

  1. 菜鳥教程: >>點選檢視<<
  2. C語言中文網:>>點選檢視<<
  3. Shell 線上工具:>>Shell 線上工具<<

一. 簡介

Linux 是一個開源的作業系統,由分佈在世界各地的多個組織機構或個人共同開發完成,每個組織結構或個人負責一部分功能,最後組合在一起,就構成了今天的 Linux。例如:

  • Linux 核心最初由芬蘭黑客 Linus Torvalds 開發,後來他組建了團隊,Linux 核心由這個團隊維護。
  • GNU 組織開發了很多核心軟體和基礎庫,例如 GCC 編譯器、C語言標準庫文字編輯器 Emacs程序管理軟體Shell 以及 GNOME 桌面環境等。
  • VIM 編輯器由荷蘭人 Bram Moolenaar 開發。

WindowsMac OSAndroid 等作業系統不一樣,它們都由一家公司開發,所有的核心軟體和基礎庫都由一家公司做決定,容易形成統一的標準,一般不會開發多款功能類似的軟體。

Linux 不一樣,它是“萬國牌”,由多個組織機構開發,不同的組織機構為了發展自己的 Linux 分支可能會開發出功能類似的軟體,它們各有優缺點,使用者可以自由選擇。Shell

就是這樣的一款軟體,不同的組織機構開發了不同的 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

在這裡插入圖片描述

輸出結果表明預設的 Shellbash

二、第一個Shell指令碼

開啟文字編輯器(可以使用 vi/vim 命令來建立檔案),新建一個檔案 test.sh,副檔名為 sh(sh代表shell),副檔名並不影響指令碼執行,見名知意就好,如果你用 php 寫 shell 指令碼,副檔名就用 php 好了。

輸入一些程式碼,第一行一般是這樣:

#!/bin/bash
echo "Hello World !"

#! 是一個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種 Shell
echo 命令用於向視窗輸出文字。

執行 Shell 指令碼有兩種方法:

  1. 作為可執行程式
    將上面的程式碼儲存為 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 告訴系統說,就在當前目錄找。

  1. 作為直譯器引數
    這種執行方式是,直接執行直譯器,其引數就是 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 通過PS1PS2兩個環境變數來控制提示符格式:
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 輸出 PS1PS2

[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 使用以\為前導的特殊字元來表示命令提示符中包含的要素,這使得 PS1PS2 的格式看起來可能有點奇怪。下表展示了可以在 PS1PS2 中使用的特殊字元。

字元描述
\a鈴聲字元
\d格式為“日 月 年”的日期
\eASCII轉義字元
\h本地主機名
\H完全合格的限定域主機名
\jshell當前管理的作業數
\1shell終端裝置名的基本名稱
\nASCII換行字元
\rASCII回車
\sshell的名稱
\t格式為“小時:分鐘:秒”的24小時制的當前時間
\T格式為“小時:分鐘:秒”的12小時制的當前時間
@格式為am/pm的12小時制的當前時間
\u當前使用者的使用者名稱
\vbash shell的版本
\Vbash shell的釋出級別
\w當前工作目錄
\W當前工作目錄的基本名稱
!該命令的bash shell歷史數
#該命令的命令數量
$如果是普通使用者,則為美元符號$;如果超級使用者(root 使用者),則為井號#。
\nnn對應於八進位制值 nnn 的字元
\斜槓
[控制碼序列的開頭
]控制碼序列的結尾

注意
所有的特殊字元均以反斜槓\開頭,目的是與普通字元區分開來。您可以在命令提示符中使用以上任何特殊字元的組合。

我們可以通過修改 PS1 變數來修改提示符格式,例如:
純文字複製

[[email protected] ~]$ PS1="[\t][\u]\$ "
[17:27:34][dreamhai]$ 

新的 Shell 提示符現在可以顯示當前的時間和使用者名稱。不過這個新定義的 PS1 變數只在當前 Shell 會話期間有效,再次啟動 Shell 時將重新使用預設的提示符格式。