Bash Shell詳解

引言:什么是Shell?

Linux的命令行接口歸結起來就是各種Shell,那么到底什么是Shell?
Shell,譯為外殼,是用戶直接連入計算機所使用的計算機程序,負責解析用戶提供的命令,如詞法分析、語法分析、句法分析。

1.Shell的分類

Linux 的命令 shell 是與操作系統相分離的一層。不同的 shell 環境影響您具備不同的功能,比如可編輯的命令行和歷史命令回查等。shell 還決定了腳本中函數的語法。
下面就列舉幾個常用的Shell:
1.  bash
bash shell 是 Bourne shell 的一個免費版本,它是最早的 Unix shell,包括許多附加的特點。Bash 有可編輯的命令行,可以回查歷史命令,支持 tab 鍵補齊以使用戶避免輸入長的文件名。
2.  csh
C shell 使用的是“類C”語法,借鑒了 Bourne shell 的許多特點,只是內部 shell 命令集有所不同。
3.  ksh
Korn shell 的語法與 Bourne shell 相同,同時具備了 C shell 的易用特點。許多安裝腳本都使用 ksh ,即使您不把它作為您的主 shell,您也應該在系統中安裝它。
4.  tcsh 
TC shell 是 C shell 的一個增強版本,與 C shell 完全兼容。
5.  zsh
Z shell 是 Korn shell 的一個增強版本,具備 bash shell 的許多特色。
> 默認的 shell 是每個用戶帳號的一個參數。Linux 中典型的默認 shell 是 /bin/bash,不過也可以用其他的 shell。每個 shell 的 man 文檔實際上都非常好,都對各種 shell 及其使用進行了詳細的說明。

2.Bash Shell的界面和命令處理機制

Bash Shell的命令提示符:
[ username@hostname working_directory ] {#|$}
看起來可能有些亂,下面來具體介紹一下吧。
username: 用戶登入Linux系統所使用的用戶
hostname: 當前主機的主機名,非完整格式
working_directory :用戶當前所在目錄,隨著用戶的目錄切換而切換的
‘#’:  管理員賬號登陸,為root,擁有最高權限,能執行所有操作;
‘$’:  普通用戶,非root用戶登錄,不具有管理員權限,不能執行系統管理類操作;

shell命令的處理機制
shell程序在接收到用戶執行命令的請求,分析完成之后,最左側的字符串會被當作命令,具體查找順序如下:
1. 查找內部命令
2. 根據PATH環境變量中設定的目錄,自左向右逐個搜索目錄下的文件名
> 注意:
為了安全起見,建議使用非管理員賬號登陸!執行管理操作時,臨時切換至管理員賬號,操作完成后即退回。

3.Bash Shell的特性

bash shell有很多的特性,基于這些特性讓bash shell變得非常易用。

序號 | 特性
—— | ——
1 | 支持命令歷史
2 | 支持管道、重定向
3 | 支持命令別名
4 | 支持命令行編輯
5 | 支持命令行展開
6 | 支持文件名通配(globbing) 
7 | 支持使用變量
8 | 支持編程
9 | 支持命令補全
10 | 支持路徑補全
11 | 支持命令別名
12 | 支持命令引用(替換)

4.Bash Shell基礎知識

Bash Shell文件名通配符

通配符號 | 含義
———— | ——
* | 可以用于匹配任意長度的任意字符
? | 可以匹配任意單個字符
[] | 可以匹配指定范圍內的任意單個字符,例如:[a-zA-Z]*[0-9], 以單個字母開頭,以數字結尾的字符串
[^] | 匹配指定范圍之外的任意單個字符
還有一些還有一些特殊的通配符,還需要再加上[]才能使用,這些也支持取反格式:[^[]]

通配符號 | 含義
———— | ——
[:space:] | 空白字符
[:punct:] | 標點符號
[:lower:] | 小寫字母
[:upper:] | 大寫字母
[:alpha:] | 大小寫字母
[:digit:] | 數字
[:alnum:] | 數字和大小寫字母
> 還有更多的特殊通配符,可以通過man 7 glob來查詢幫助

命令補全
在用戶輸入命令的部分字母后,可以敲擊Tab鍵,通過Bash Shell的命令不全功能,在PATH環境變量中搜索與之前敲擊字符相同的命令,并進行自動補全,如果出現多個,再敲擊一次Tab,則會以列表形式展現出來。

路徑補全
用戶可以在輸入路徑、文件時不必輸入路徑或文件的全部名稱,而是根據給定的起始路徑,輸入能夠唯一代表該路徑或文件的部分字符后,通過Tab鍵進行路徑補全,提高輸入效率。如果輸入的字符不能唯一代表路徑或文件,需要再次敲擊Tab鍵,以列表形式列出符合要求的路徑或文件。

命令執行的狀態結果
Bash Shell通過狀態返回值來輸出命令的執行結果:
成功:0
失?。?-255
命令執行完成之后,其狀態返回值會保存于Bash Shell的特殊變量$?中。
示例:
~]# echo $?
一般在執行完某一個指定命令后執行,來查看命令的執行狀態結果。

命令引用(替換)用法 – 把命令中某個子命令替換為其執行結果的過程
命令替換可以使用兩種方法:$()或者 `COMMAND`是反引號
示例:
用pwd命令的結果替換:echo "The current directory is $(pwd)"
用date命令的結果替換:touch ./file-$(date +%Y-%m-%d-%H-%M-%S).txt

命令行展開

符號 | 含義
—— | ——
~ | 自動展開為用戶的家目錄,或指定用戶的家目錄
{} | 可承載一個以逗號分割的路徑列表,并能夠將其展開為多個路徑

示例:
/tmp/{a,b},相當于/tmp/a和/tmp/b

練習題:
1. 創建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b
~]# mkdir -pv /tmp/x/{y1/{a,b},y2}
2. 創建/tmp/a_c, a_d, b_c, b_d
~]# mkdir -v /tmp/{a,b}_{c,d}
3. 創建如下目錄結構:

練習目錄結構.png
~]# mkdir -pv /tmp/mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}

Bash Shell支持的引號

引號類型 | 作用
———— | ——
反引號“或 $() | 命令引用(替換)
雙引號”” | 弱引用,可以實現變量替換
單引號‘’ | 強引用,不完成變量替換

命令行編輯中光標跳轉快捷鍵

快捷鍵 | 作用
——— | ——
Ctrl+a | 跳到命令行首
Ctrl+e | 跳到命令行尾
Ctrl+u | 刪除光標至命令行首的內容
Ctrl+k | 刪除光標至命令行尾的內容
Ctrl+l | 清屏

系統輸入輸出設備

設備類型 | 表現形式 | 代碼 | 具體設備
———— | ———— | —— | ————
標準輸入 | STDIN | 0 | 鍵盤
標準輸出 | STDOUT | 1 | 顯示器
標準錯誤輸出 | STDERR | 2 | 顯示器

I/O重定向
定義:將默認輸入輸出設備改變成指定的輸入輸出設備上的過程

符號 | 作用
—— | ——
> | 標準輸出重定向,覆蓋輸出
>> | 標準輸出重定向,追加輸出
2> | 錯誤輸出重定向,將錯誤輸出至設備,覆蓋輸出
2>> | 錯誤輸出重定向,將錯誤輸出至設備,追加輸出
&> | 重定向標準輸出和錯誤輸出至同一個文件,覆蓋輸出
< | 標準輸入重定向,覆蓋輸入
<< | 標準輸入重定向,輸入多行。
示例1:
<br />
~]# cat &lt;&lt; EOF<br />
&gt; hello<br />
&gt; I am leo<br />
&gt; EOF<br />
hello<br />
I am leo<br />

示例2:
<br />
~]# cat &gt;&gt; /tmp/a.txt &lt;&lt; EOF<br />
&gt; 123<br />
&gt; 456<br />
&gt; 789<br />
&gt; EOF<br />
~]# cat /tmp/a.txt<br />
123<br />
456<br />
789<br />

> 可以通過set命令禁止對已存在的文件使用覆蓋重定向。
set -C: 禁止對已存在文件使用覆蓋重定向
如果仍然想強制覆蓋輸出,則使用>|代替>即可。
set +C:關閉禁用使用覆蓋重定向的功能

管道
定義:把前一個命令的輸出,作為后一個命令的輸入
命令格式:命令1 | 命令2 | 命令3 | …
示例1:
echo "hello, world." | tr 'a-z''A-Z'
將hello,world.字符全部變成大寫。

示例2:
echo "redhat" | passwd --stdin hive
將hive的密碼改為redhat

示例3:
cut -d: -f3 /etc/passwd | sort -n
將/etc/passwd文件中以:為分隔符的第三個字段(UID)按數值升序排列

原創文章,作者:N27_sapbcs,如若轉載,請注明出處:http://www.www58058.com/86377

(1)
N27_sapbcsN27_sapbcs
上一篇 2017-09-07 16:02
下一篇 2017-09-07 16:05

相關推薦

  • linux做路由并實現路由轉發

    一、環境介紹 1.linux版本:CentOS6.8,CentOS7.2兩臺主機分別加載兩塊網卡,分別作為路由器的兩個端口 2.實驗在vmware虛擬機中完成 3.另有兩臺CentOS6.8和CentOS7.2作為兩個網段的主機 4.實驗圖示: 二、路由1(左)和路由2(右)的設置 1.路由1配置信息 eth0網卡:    &n…

    Linux干貨 2016-09-07
  • linux 目錄結構

    該文章主要來自于網絡資料進行整理 目錄結構參考地址: http://www.iteye.com/topic/1125162 http://yangrong.blog.51cto.com/6945369/1288072 http://itlab.idcquan.com/linux/administer/939529_1.html http://itlab.id…

    系統運維 2015-12-19
  • 第一周學習內容

    1、LINUX的三大主流版本:debian slackware redhat 2、一個完整的操作系統是由內核+運行在內核之上的應用程序組成。      LINUX操作系統是由linux內核+GNU開源組織編寫的應用程序組成(GNU/Linux) 3、CPU架構:X86(X64)、摩托羅拉的m68k、arm、IBM的POWER(性…

    Linux干貨 2016-12-03
  • week2

    一、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 常用工具cp mv rm cat tac head tail more less stat cp   cp SRC…DEST A. 如果SRC是文件: a. 如果目標不存在:新建DEST,并將SRC中的內容填充至DEST中。 b. 如果目標存在: (1). 如…

    Linux干貨 2016-11-06
  • 馬哥linux0728課程內容

    課堂學習內容   -ahistory list –.bash_histroy 保存歷史列表到歷史文件 -cclear history list 清空歷史列表 -d deletehistory entru 清除歷史列表某一條命令 -rread .bash_history 讀歷史文件中的命令到歷史列表…

    Linux干貨 2016-08-04
  • Linux程序包管理(rpm、yum、make)

    linux系統程序安裝的方法有rpm yum 以及make手動編譯3種方法: rpm這個機制最早由Redhat公司開發出來,后來由于實在好用,所以被很多發行版所使用作為軟件安裝的管理方式。不過由于使用RPM安裝軟件時有時會涉及到文件的依賴信,此時需要手動去逐個安裝被依賴的包操作起來十分復雜,于是yum這種線上升級的機制便出現了,它會自己主動解決各文件的依賴關…

    Linux干貨 2017-10-02

評論列表(1條)

  • 馬哥教育
    馬哥教育 2017-10-10 12:58

    這篇博客已經超越了大部分了同學。

欧美性久久久久