慕課網Linux 達人養成計劃 I 學習筆記(五)

本文是教程第9章Shell基礎的筆記。


第9章 Shell基礎

9-1 shell概述

Shell是什麼:是一種命令行解釋器。它連接用戶和內核(“翻譯”)。另外,Shell還是一個功能相當強大的編程語言,易編寫,易調試,靈活性較強。Shell是一種腳本語言,可以直接調用Linux系統命令。
Shell的分類:

  1. Bourne Shell:從1979年起Unix就開始使用Bourne Shell(它不支持上下箭頭查找歷史輸入命令);
  2. C Shell:主要在BSD版的Unix系統中使用,其語法與C語言像類似而得名;

Shell的主要語法類型包含有Bourne和C,其中,Bourne家族主要包括有:sh,ksh,Bash(Bash與sh兼容,現在使用的Linux就是使用Bash作爲用戶的基本Shell),psh,zsh;而C家族(主要是用Unix)主要包括:csh,tcsh。
注意:

  1. 使用 echo $SHELL命令可以查看當前使用的Shell語法;
  2. /etc/shells 文件記錄當前系統所兼容的Shell類型;

9-2 腳本執行方式

echo命令:在Shell終端輸出給定的內容。加上-e選項能識別特定的控制字符(類似於C++中的轉義字符)。
注意:sh腳本開頭的"#!/bin/bash"不能省略,它標稱下面所寫的腳本是Linux的標準腳本,此處的"#"也不是註釋的意思。當腳本中單純只有Shell語言的時候,不加這句代碼可能不會報錯,但是當腳本中出現Shell語言調用其它語言的時候,沒有加上這句代碼的話就會報錯。
Shell腳本的執行方法(假設執行test.sh這個腳本文件):

  1. 賦予執行權限,直接運行:
  2. 通過Bash調用執行腳本:

本章接下來的內容是學習一些關於Linux的標準Shell——Bash的基本功能

9-3 別名與快捷鍵

命令別名:類似於人的小名。
查看系統現有的別名:alias
給命令賦別名:alias 別名=‘原命令’。EX:alias ls=‘ls --color=never’,其好處在於:

  • 可以給一些比較長的命令賦予別名;
  • 或者將一些書寫不習慣的命令定義成習慣的寫法。

注意:用上面的方法定義的別名在重啓之後會失效,所以可以通過下面介紹的方法定義長期的別名:
修改 ~/.bashrc環境變量配置文件,在其中添加 alias 別名=‘原命令’ 即可以使別名永久生效。這裏需要注意的是:

  1. ~/.bashrc文件知識針對當前home目錄所對應的用戶的,對其他用戶無效;
  2. ~/.bashrc修改後需要重啓才能生效,或者可以使用source ~/.bashrc命令使其生效。

刪除別名:unlias。EX:unalias ls=‘ls --color=never’。與alias一樣,它只是臨時刪除,想用就刪除得在~/.bashrc文件中進行刪除。

命令生效順序(比如擁有’rm -i’這一別名的rm命令,系統如何判斷是單純執行rm,還是要執行rm -i):

  1. 用絕對路徑或相對路徑執行的命令(即直接定位到命令對應的可執行文件的位置);
  2. 執行別名;
  3. 執行Bash的內部命令(比如:cd);
  4. 執行按照$PATH環境變量定義的目錄查找順序找到的第一個命令。
    所以從上面的四個優先級可以看出,別名的優先級高於按照$PATH環境變量來查找命令。

下面是一些常用的快捷鍵(ctrl+下面的按鍵):

  • c:強制終止當前命令;
  • l:清屏;
  • a:光標移動到命令行首;
  • e:光標移動到命令行尾;
  • u:從光標所在位置刪除到行首;
  • z:把命令放入後臺;
  • r:在歷史命令中搜索(輸入相應的關鍵字之後,會自動搜索出含有該關鍵字的命令)。

9-4 歷史命令

查看歷史命令:history
選項:

  1. -c:清空歷史命令;
  2. -w:把緩存中歷史命令寫入到歷史命令保存文件~/.bash_history。
    此處要注意的是,歷史命令存在與緩存以及歷史命令保存文件兩個地方,一般只有在成功註銷或者執行history -w命令之後,緩存中的歷史命令才能正確寫入~/.bash_history中。

系統默認保存1000條歷史命令,如果要增加歷史命令的保存數目,可以對/etx/profile文件中的HISTORY變量進行修改。

歷史命令的調用:

  1. 使用上下箭頭;
  2. 使用"!n"執行第n條歷史命令;
  3. 使用"!!"執行上一條歷史命令;
  4. 使用"!字符串"執行最後一條以該字符串開頭的命令。

用Tab鍵進行命令補全(目錄補全是在$PATH環境變量下進行所搜的),文件補全和目錄補全。

9-5 輸出重定向

標準輸入輸出:

設備 設備文件名 文件描述符 類型
鍵盤 /dev/stdin 0 標準輸入
顯示器 /dev/stdout 1 標準輸出
顯示器 /dev/stderr 2 標準錯誤輸出

注意:計算機的標準輸入是鍵盤,不包括鼠標等等其它的輸入設備,而標準輸出是顯示器,不包括投影儀等。

輸出重定向:改變標準輸出的方向,也就是說,讓輸出不顯示在屏幕上,而是記錄在其它的地方,比如:文件中。

標準輸出重定向:

  1. 命令 > 文件:以覆蓋的方式,把命令的正確輸出輸出到指定的文件或者設備當中;
  2. 命令 >> 文件:以追加的方式,把命令的正確輸出輸出到指定的文件或者設備當中。

標準錯誤輸出重定向:

  1. 錯誤命令 2>文件:以覆蓋的方式,把命令的錯誤輸出輸出到指定的文件或者設備當中;
  2. 錯誤命令 2>>文件:以追加的方式,把命令的錯誤輸出輸出到指定的文件或者設備當中;
    注意:這裏的"2"代表的就是上面表格中的文件描述符。但是,上面提到的輸出重定向的缺點是:用戶必須在輸入命令的時候明確知道命令是否會得到錯誤的輸出,但是這在一開始運行命令的時候往往是不知道的。

所以有下面的解決辦法:

  1. 命令 > 文件 2>&1:以覆蓋的方式,把正確的輸出和錯誤的輸出都保存到同一個文件當中(這裏"命令 > 文件 2>&1"的意思是:把正確的輸出寫入到文件,如果是錯誤的輸出,則合併到正確的輸出中一起寫入文件);
  2. 命令 >> 文件 2>&1:以追加的方式,把正確的輸出和錯誤的輸出都保存到同一個文件當中;
  3. 命令 &> 文件:以覆蓋的方式,把正確的輸出和錯誤的輸出都保存到同一個文件當中(功能同1);
  4. 命令 &> 文件:以追加的方式,把正確的輸出和錯誤的輸出都保存到同一個文件當中(功能同2);
  5. 命令>>文件1 2>>文件2:把正確的輸出追加到文件1,把錯誤的輸出追加到文件2。
    BTW:/dev/null文件是Linux中的"無底洞",是系統幫用戶準備的,用戶可以將一些沒有用的輸出寫入到這個文件中。就相當於輸出信息的回收站。

輸入重定向:改變終端輸入的方式。也就是說,終端的輸入不再是鍵盤,而可以是文件的內容等等。注意,輸入重定向用的相對比較少,只作瞭解就足夠了
用於統計文件行數,單詞數以及字節數的命令:wc [選項][文件名]。
選項:

  1. -c:統計字節數;
  2. -w:統計單詞書;
  3. -l:統計行數。
    注意:如果直接在終端輸wc,則統計的是在按ctrl+D之前的文本內容的信息。

輸入重定向舉例:

  1. <:wc < test.log,表示對test.log文件的內容進行統計(其實,直接wc test.log也是可以的);
  2. <<:wc << 字符串,表示統計終端輸入指定字符串之前的文本的信息。

9-6 管道符

多命令順序執行的符號:

多命令執行符 格式 作用
; 命令1;命令2 多個命令之間順序執行,命令之間沒有任何邏輯關係(即無論前面的命令是否能夠正確運行,後面的命令都會執行)
&& 命令1&&命令2 邏輯與,命令1正確執行的時候命令2纔會執行
|| 命令1||命令2 邏輯或,當命令1不正確執行的時候,命令2纔會執行

BTW:關於多命令執行符,有下面的一些應用:

  1. 計算一條命令執行所佔用的時間:“date;命令;date”,前後兩次date的輸出只差就是zhix中間的命令所佔用的時間(當然,查看命令執行時間的方法還有很多);
  2. 查看一條命令是否正確執行:“命令 && echo yes || echo no”,如果該命令正確執行,則執行echo yes而不會執行echo no,否則,不執行echo yes而執行echo no。

管道符:“命令1|命令2,命令1的正確輸出作爲命令2的操作對象(也就是說,這個和”&&"類似,只是命令1的輸出作爲命令2的操作對象)。
EX:ls -l | more 。即分頁查看(more的功能)ls -l的輸出。又比如上面4-4節舉的搜索字符串命令grep的例子:locate opencv | grep “2.4” 。又或者:ls -l | grep "caffe"等等。管道符有着很廣泛的應用。

9-7 通配符

首先,有一點需要注意:通配符主要是用來匹配目錄名或者文件名稱的,如果要匹配文件內容,則需要用到正則表達式。

Linux中的通配符:

  1. *:匹配任意內容;
  2. ?:匹配任意一個字符;
  3. []:匹配任意一個括號中的字符。
    EX:find /root -name “ab?” 以及 find /root -name “ab[cd]” (後面的一句命令匹配的是名爲abc或者abd的文件)
    • [-]:find /root -name "ab[a-d]"表示文件名的第三個字母是a-d中的任意一個;
    • [^]:find /root -name "ab[^a-d]"表示文件名的第三個字母不是a-d中的任意一個。

Linux中的其它特殊符號:

符號 作用
‘’ 單引號。在單引號中的所有特殊符號,如“$”和“`”(反引號)都沒有特殊的含義
“” 雙引號。在雙引號中,特殊符號都沒有特殊含義,但是“$”,“`”(反引號)和“\”是例外,擁有“調用變量的值”,“引用命令”和“轉義符”的特殊含義
`` 反引號。反引號括起來的內容是系統命令,在Bash中先執行它。和()使()的作用是一樣的,**不過推薦使用(),因爲反引號非常容易看錯**。EX:aa=`ls`的結果是將ls命令執行的結果賦值給變量
$() 作用和反引號一樣,用於引用系統命令
# 代表行註釋
$ 用於調用變量的值。
\ 轉義符。跟在它後面的特殊符號將失去特殊含義,變爲普通字符。如$將輸出“$”符號,而不當做是變量引用

注意:

  1. 第一行的是單引號,第三行的是反引號(反引號在鍵盤的左上角)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章