首頁 > 軟體

Shell中bash的特性小結

2020-06-16 17:03:48

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

bash的特性:

 一、命令的別名——(自定義命令)
  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/.檔名【引數】

二、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中使用

三、命令歷史:
 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:上述兩種情況都不會被記錄到歷史緩衝區;

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

五、命令列展開
 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  下載  公共的  圖片  文件  桌面  模板  視訊  音樂
 
六、命令的執行結果
在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):使用者可以自定義的失敗狀態返回值;

七、參照功能:
  ‘’ :強參照
    凡是被單引號參照的內容,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

八、跳脫功能
  :bash定義的跳脫字元:大多數情況下,“”只能將其後面一個字元跳脫;
例如:[root@localhost ~]# echo $PATH
$PATH
[root@localhost ~]# echo $$PATH
$/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
COMMAND:取消定義過的命令別名,而使用命令本身的功能;

九、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是在貪婪模式下匹配的;

十、管道
 |
  管道通常用來連線多個命令的:將管道符號前面的命令的執行的輸出結果通過管道傳遞給管道符號後面的命令,讓後面的命令將前面的輸出結果當成引數使用;
 wc
 wc - print newline, word, and byte counts for each file
 格式:wc [OPTION]... [FILE]...
  常用選項:
  -c, --bytes:僅顯示檔案中位元組數;
  -m, --chars:僅顯示檔案有效字元的數量
  -l, --lines:僅顯示檔案中內容的行數
  -w, --words:僅顯示檔案中字的數量
 注意:
1. 一般來講,凡是被管道連線的命令,都應該能夠在執行成功之後完成命令結果的輸出,否則管道無意義;
2. 管道不是萬能的,有些場合沒辦法使用管道的 ;

十一、輸入和輸出重定向
 在使用計算的時候,實現某個功能的主體是程式;
 程式=指令+資料
 資料至關重要!
 檔案,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,此處字串,結束標記;

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-10/148020.htm


IT145.com E-mail:sddin#qq.com