Shell中bash的特性小結

Shell:

用戶與操做系統之間完成交互式操做的一個接口程序,爲用戶提供簡化了的操做;上世紀的70年代中期在貝爾實驗室,Bourne位Unix開發了一個shell程序Bourne Shell,簡稱sh;
Bill Joy:用C語言根據sh從新編寫 C Shell,簡稱csh;躺牀上爲其衍生版;
David Korn:集合cshhesh的優勢研發的Korn Shell,簡稱ksh;
GNU:GNU組織發現sh是比較好用的又進一步開發Borne Again Shell,簡稱bash;Linux系統中默認的shell程序;
zsh:最終Shell,功能很是強大;(可是在linux中並無更換)
當前系統中全部能夠支持的安全的shell:
 /etc/shells
注意:
1. 除了/sbin/nologin以外,其餘的shell均可以用來測試使用;
2. 在更換shell時,最好在bash中更換其餘shell,若是已經換成了其餘shell就使用exit命令返回至bash,再行切換;
3. 選擇shell
  [root@localhost ~]# cat /etc/shells
  /bin/sh
  /bin/bash
  /sbin/nologin
  /usr/bin/sh
  /usr/bin/bash
  /usr/sbin/nologin
  /bin/tcsh
  /bin/csh
  [root@localhost ~]# echo $0
  bash
  [root@localhost ~]# tcsh
  [root@localhost ~]# echo $0
  tcsh
  切換爲原來的shell
  [root@localhost ~]# exit
  exit
  [root@localhost ~]# echo $0
  bash
linux

bash的特性:git

 1、命令的別名——(自定義命令)
  alias-定義或顯示別名
  格式:alias [-p] [名稱[=值] ... ]
  若是alias命令不帶任何選項或參數,則表示顯示全部已經定義並生效的別名設置;
  #alias ALIAS=’COMMAND [OPTION]…[ARGUMENT]…’
 Unalias 
  Unalias-從別名定義列表中刪除每個「名字」
  格式:unalias [-a] 名稱 [名稱 ...]
注意:不管使用alias 或是unalias命令,其功能都會當即生效;此兩個命令的生命期僅爲當前shell的生命期一但註銷登錄,至關於關閉了bash,則使用alias命令定義的別名或使用unalias刪除的命令,會當即失效;
對於每一個用戶來講,都有一個私有的bash的配置文件,就在用戶的家目錄當中的一個隱藏文件,文件名.bashrc,其主要功能用來保存命令的別名的文件
注意:在對於此文件中的命令別名進行編輯保存以後,在當前已經運行的bash中並不會當即生效,須要從新加載才能使配置生效,如下兩種操做皆可實現:
  1.重啓bash:註銷以後再次登錄便可;
  2.指向文件中定義的命令:使用source命令,或者.命令;
  source/.
  「source」-在當前shell中執行一個文件中的命令。
  「 .」    -在當前shell中執行的一個文件中的命令
  格式:source/.文件名【參數】shell

2、bash的快捷鍵
  C:表示Ctrl鍵
  M:Alt鍵
  E:Esc鍵
  DEL:Backspace鍵
 C-l:清屏,至關於clear命令;
 C-a:將光標跳轉至命令行編輯模式的行首
 C-e:將光標跳轉至命令行編輯模式的行尾
 C-k:當前光標位置刪除至行尾
 C-u:當前光標位置刪除至行首
 C-c:結束前臺進程
 M-.:引用上一個命令中的最後一個參數;(載Xshell中不能用)
 E按一次再按.:功能同上一個M-.能夠在Xshell中使用緩存

3、命令歷史:
 bash進程會保存其會話中的用戶曾經執行過的命令,以方便用戶重複執行某個命令;命令歷史包括兩個各方面:
  1.用戶曾經執行過的命令;
  2.用戶層執行過的命令的路徑;
在bash中有一個內置的變量-PATH,PATH變量的值爲當前系統中全部命令的文件所在的路徑集合;
命令如何被shell執行的?
 bash會將命令行的內容按照空白字符進行切片,分析第一個切片內容;
  1.判斷第一個切片的內容是內部命令仍是外部命令;
若是是內部命令,直接運行;
  若是是外部命令,先找hash表中的路徑緩存,若是有則直接執行;不然,則須要經過查找PATH變量中包含路徑中,是否有對應名稱的文件;
  使用hash命令查看被記住的命令文件的路徑;
  -r:清空hash表
  使用history命令來顯示曾經執行過的命令參數;
  hietory-顯示和操縱歷史列表
  格式:history [-c] [-d 偏移量] [n] 或 
                      history -anrw [文件名] 或 history -ps 參數 [參數...]
  經常使用選項:
-c:清空歷史緩衝區中的命令歷史紀錄;
-d OFFSET:刪除指定的歷史命令條目;
重複執行歷史緩衝區的命令:
「!編號」 :直接調用歷史緩衝區中此編號命令;
「!STRING」 :重複執行歷史緩衝區中以STRING開頭的最後一次執行過的命令;
!?STRING :重複執行歷史緩衝區中包含了「STRING」的最後一次執行過的命令;
    !-編號    :直接調用歷史緩衝區中此編號命令;
使用上下箭頭也可調用歷史緩衝區命令回車執行;
C-r :在歷史緩衝區中實施搜索,回車以後執行;
    !$ :在歷史緩衝區中調用最後一個命令的最後一個參數;
!^ :在歷史緩衝區中調用最後一個命令的第一個位置的參數;
!  :NUMBER:在歷史緩衝區中調用最後一個命令中第NUMBER位置參數;
!SEQUENCE:NUMBER :歷史緩衝區中調用第「SEQENCE」條命令中第NUMBE位置                          的參數;
在bash中與命令相關的內置變量:(變量名稱大小寫敏感不能打錯)
  HISTSIZE:歷史緩衝區中可以保存的命令歷史的最大條目數量:默認是1000;
  HISIFILESIZE:~/.bash_history文件中可以保存的命令歷史的最大條目數量:默認是1000;
  HISTIMEFOMAT:在命令歷史緩衝區中記錄歷史命令時,同時記錄命令的執行的時間戳標記:可使用date命令的FORMAT來表示時間的記錄格式:默認值爲空;
  HISTCONTROL:控制命令歷史的記錄方式;
ignoredups:忽略連續切向同行的命令被記錄到歷史緩衝區,此爲默認值;
ignotrspace:以空白字符開頭的命令不會被記錄到歷史緩衝區;
Ignoreboth:上述兩種狀況都不會被記錄到歷史緩衝區;安全

4、命令補全——(TAB鍵的使用)
 包括兩個發麪的內容:
  1.構成命令字符串的補全;
參考PATH變量中的路徑,對命令進行補全;
  若是,給出的字符串在PATH變量對應的路徑中是惟一的,則直接補全命令;
  若是,給出的字符串在PATH變量對應的路徑中是否是惟一的,則bash給出提示;
  2.命令中參數所對應的字符串補全
  根據給出的路徑進行補全:
    若是,給出的字符串在給出的路徑中是惟一的,則直接補全命令;
    若是,給出的字符串在給出的路徑中是否是惟一的,則bash給出提示;bash

5、命令行展開
 1.~展開:
  ~:bash會自動將其展開爲當前登陸用戶的家目錄;
  ~STRING:bash會將其自動展開爲以「STRING」爲用戶名的用戶的家目錄;
  ~+:調用bash的內置變量「PWD」的值;
  ~-:調用bash的內置變量「OLDPWD」的值;
 2.{}展開:
  在{}中,能夠填充一個以「,」(英文輸入法中的「,」)分隔的路徑列表,bash會將其展開爲多個獨立路徑;
兩種應用
[root@localhost ~]# mkdir -pv /china/{hb,hn,qd,bj}/{1,2,3}/class18
mkdir: 已建立目錄 "/china"
mkdir: 已建立目錄 "/china/hb"
mkdir: 已建立目錄 "/china/hb/1"
mkdir: 已建立目錄 "/china/hb/1/class18"
mkdir: 已建立目錄 "/china/hb/2"
mkdir: 已建立目錄 "/china/hb/2/class18"
mkdir: 已建立目錄 "/china/hb/3"
mkdir: 已建立目錄 "/china/hb/3/class18"
mkdir: 已建立目錄 "/china/hn"
mkdir: 已建立目錄 "/china/hn/1"
mkdir: 已建立目錄 "/china/hn/1/class18"
mkdir: 已建立目錄 "/china/hn/2"
mkdir: 已建立目錄 "/china/hn/2/class18"
mkdir: 已建立目錄 "/china/hn/3"
mkdir: 已建立目錄 "/china/hn/3/class18"
mkdir: 已建立目錄 "/china/qd"
mkdir: 已建立目錄 "/china/qd/1"
mkdir: 已建立目錄 "/china/qd/1/class18"
mkdir: 已建立目錄 "/china/qd/2"
mkdir: 已建立目錄 "/china/qd/2/class18"
mkdir: 已建立目錄 "/china/qd/3"
mkdir: 已建立目錄 "/china/qd/3/class18"
mkdir: 已建立目錄 "/china/bj"
mkdir: 已建立目錄 "/china/bj/1"
mkdir: 已建立目錄 "/china/bj/1/class18"
mkdir: 已建立目錄 "/china/bj/2"
mkdir: 已建立目錄 "/china/bj/2/class18"
mkdir: 已建立目錄 "/china/bj/3"
mkdir: 已建立目錄 "/china/bj/3/class18"
經常使用做同時建立多個目錄
[sola@localhost ~]$ ls
c.txt  下載  公共的  圖片  文檔  桌面  模板  視頻  音樂
[sola@localhost ~]$ cp c.txt{,.bak}
[sola@localhost ~]$ ls
c.txt  c.txt.bak  下載  公共的  圖片  文檔  桌面  模板  視頻  音樂
6、命令的執行結果
在bash中,命令的執行結果有兩種:
 1.執行命令的輸出結果:
  根據用戶需求獲取到的命令執行的正常輸出結果;
  命令引用或命令替換:
  ``(波浪線鍵使用英文輸入法)至關於$()
  ``:反向單引號,反引號
  示例:
  [root@localhost ~]# ls
  123  abc  anaconda-ks.cfg  a.txt  b.txt  initial-setup-ks.cfg  公共  模  板  視頻  圖片  文檔  下載  音樂  桌面
  [root@localhost ~]# touch a.txt-$(date +%F-%H-%M-%S)
  [root@localhost ~]# ls
  123  abc  anaconda-ks.cfg  a.txt  a.txt-2017-10-26-14-40-46  b.txt      initial-setup-ks.cfg  公共  模板  視頻  圖片  文檔  下載  音樂  桌面
  [root@localhost ~]# touch a.txt-`date +%F-%H-%M-%S`
  [root@localhost ~]# ls
  123  abc  anaconda-ks.cfg  a.txt  a.txt-2017-10-26-14-40-46  a.txt-      2017-10-26-14-41-48  b.txt  initial-setup-ks.cfg  公共  模板  視頻  圖片  文檔  下載  音樂  桌面
此操做經常使用於文件的備份時標記備份時間
 2.執行命令的狀態返回值:
 與此前的一個命令是否成功執行相關的返回內容;
  Bash使用一個特殊的內置變量來保存其內容:$?
  $?實際上保存的是一個數值,其取值範圍:0~255
  其中 :
  0:表示命令執行成功;
  1~255:表示命令執行失敗
  1,2,127:bash中內置的命令執行失敗的狀態返回值;
1:表示一些小問題
2:表示嚴重的問題
127:表示命令本事出現問題;
其與數字(3-126,128-255):用戶能夠自定義的失敗狀態返回值;dom

7、引用功能:
  ‘’ :強引用
    凡是被單引號引用的內容,bash處理時,一概視其爲普通字符,即便其自己是bash定義的具備特殊功能能和做用的字符亦是如此,但單引號自己除外;
  「」:弱引用
    被雙引號引用的內容中,有些特殊字符仍然會保留其特殊含義,如:$,\,’」」;
例如:
[root@localhost ~]# date +%F +%T
date: 額外的操做數 "+%T"
Try 'date --help' for more information.
[root@localhost ~]# date +"%F %T"
2017-10-26 15:25:19
[root@localhost ~]# date +'%F %T'
2017-10-26 15:25:43測試

8、轉義功能
  \:bash定義的轉義字符:大多數狀況下,「\」只能將其後面一個字符轉義;
例如:[root@localhost ~]# echo \$PATH
$PATH
[root@localhost ~]# echo \$$PATH
$/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
\COMMAND:取消定義過的命令別名,而使用命令自己的功能;spa

9、Globbing——文件名通配符,簡稱爲glob:
 *:匹配任意長度的任意字符或字符串;(某些特殊位置的「.」是不能匹配的)
 ?:匹配任意單個字符;(某些特殊位置的「.」是不能匹配的)
 []:匹配任意指定範圍內的人以單個字符,必須匹配且只能匹配一個字符;
  指定範圍的方法:
  1.枚舉法:列出全部有效字符;
  2.範圍指定:
[0-9]:表示全部單個的十進制數字;
[a-z]:a,A,b,B……y,Y,z(不包含Z)
[A-Z]:A,B,b,C……y,Y,Z,z(不包含a)
  3.bash內建字符集:
    [:lower:]:全部的小寫字母
    [:upper:]:全部的大寫字母
    [:alpha:]:全部字母包括大小寫
    [:digit:]:全部的單個十進制數字
    [:alnum:]:全部的字母和十進制數字
    [:punct:]: 全部的符號
    [:space:]:表示空白字符,包括空格和製表符
  4.反向匹配:
    ^
    示例:
      #ls a[^[:digit:]]?? //表示文件名的第二個字符不能是十進制數字;
      注意:當中括號中有^表示字符集反向匹配時,注意*的使用;由於通配範圍可能會致使反向匹配失敗;
此類失敗是由於bash的globbing是在貪婪模式下匹配的;操作系統

10、管道
 |
  管道一般用來鏈接多個命令的:將管道符號前面的命令的執行的輸出結果經過管道傳遞給管道符號後面的命令,讓後面的命令將前面的輸出結果當成參數使用;
 wc
 wc - print newline, word, and byte counts for each file
 格式:wc [OPTION]... [FILE]...
  經常使用選項:
  -c, --bytes:僅顯示文件中字節數;
  -m, --chars:僅顯示文件有效字符的數量
  -l, --lines:僅顯示文件中內容的行數
  -w, --words:僅顯示文件中字的數量
 注意:
1. 通常來說,凡是被管道鏈接的命令,都應該可以在執行成功以後完成命令結果的輸出,不然管道無心義;
2. 管道不是萬能的,有些場合沒辦法使用管道的 ;

11、輸入和輸出重定向 在使用計算的時候,實現某個功能的主體是程序; 程序=指令+數據 數據相當重要! 文件,IO——輸入輸出 在linux系統中,可以完成輸入和輸出的實體:文件; 能夠用於輸入的設備:文件  鍵盤設備、文件系統中的常規文件、網卡設備、聲卡設備等 能夠用於輸出的文件:文件  顯示器、文件系統中的常規文件、網卡設備、聲卡設備、磁盤設備等; 在內存中使用文件的方法是定義文件描述符,一個文件描述符就對應一個文件;  0:表示標註輸入,stdin,從鍵盤實現的輸入數據流;  1:表示標註輸出,stdout,到顯示器的輸出數據流;  2:表示標準錯誤,stderr,到顯示器上的錯誤數據流; 輸入輸出重定向(IO重定向)  採用非標準設備文件實現的IO操做;  輸入重定向:<(不少狀況下能夠省略)  輸出重定向:> :覆蓋輸出重定向 ~]# set -C  //防止意外覆蓋源文件開關,可使用「>|」符號完成覆蓋重定向輸出的操做,而無需關心防止意外開關是否開啓~]# set -C  //關閉防止意外覆蓋源文件開關>>:追加輸出重定向  錯誤重定向:  2> :覆蓋錯誤重定向  2>>:追加錯誤重定向  和並標註輸出和標準錯誤的重定向:    1.COMMAND{>|>>} /PATH/TO/SOMEFILE 2>&1    2.&>,&>>  特殊的設備文件:  /dev/null:BlackHole,BitBucket(位桶)  /dev/zero:泡泡機,吐零機;  bash中的其餘特殊符號:<<:here document ,此處文檔結束標記;(很經常使用)<<<:here string,此處字符串,結束標記;

相關文章
相關標籤/搜索