SHELL中bash的部分特性

SHELL

 用戶與操作系統之間完成交互式操作的一個接口程序,爲用戶提供簡化了的操作;

上世紀的70年代中期在貝爾實驗室,BourneUnix開發了一個shell程序Bourne Shell,簡稱sh

 

Bill Joy:用C語言根據sh重新編寫 C Shell,簡稱csh;躺牀上爲其衍生版;

 

David Korn:集合cshhesh的優點研發的Korn Shell,簡稱ksh

 

GNUGNU組織發現sh是比較好用的又進一步開發Borne Again Shell,簡稱bashLinux系統中默認的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

  MAlt

  EEsc

  DELBackspace

 

 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位置參數;

SEQUENCENUMBER :歷史緩衝區中調用第“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會自動將其展開爲當前登錄用戶的家目錄;

  ~STRINGbash會將其自動展開爲以“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-21-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-21-14-40-46  a.txt-       2017-10-21-14-41-48  b.txt  initial-setup-ks.cfg  公共  模板  視頻  圖片   文檔  下載  音樂  桌面

此操作常用於文件的備份時標記備份時間

 2.執行命令的狀態返回值:

 與此前的一個命令是否成功執行相關的返回內容;

  Bash使用一個特殊的內置變量來保存其內容:$?

   $?實際上保存的是一個數值,其取值範圍:0~255

  其中

   0:表示命令執行成功;

   1~255:表示命令執行失敗

   12127bash中內置的命令執行失敗的狀態返回值;

1:表示一些小問題

2:表示嚴重的問題

127:表示命令本事出現問題;

其與數字(3-126128-255):用戶可以自定義的失敗狀態返回值;

七、引用功能:

   ‘’ :強引用

    凡是被單引號引用的內容,bash處理時,一律視其爲普通字符,即使其本身是bash定義的具有特殊功能能和作用的字符亦是如此,但單引號本身除外;

  “”:弱引用

    被雙引號引用的內容中,有些特殊字符仍然會保留其特殊含義,如:$,\’””

例如:

[root@localhost ~]# date +%F +%T

date: 額外的操作數 "+%T"

Try 'date --help' for more information.

[root@localhost ~]# date +"%F %T"

2017-10-21 15:25:19

[root@localhost ~]# date +'%F %T'

2017-10-21 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]aAbB……yYz(不包含Z

[A-Z]ABbC……yYZz(不包含a

   3.bash內建字符集:

     [:lower:]:所有的小寫字母

     [:upper:]:所有的大寫字母

     [:alpha:]:所有字母包括大小寫

     [:digit:]:所有的單個十進制數字

     [:alnum:]:所有的字母和十進制數字

     [:punct:]: 所有的符號

     [:space:]:表示空白字符,包括空格和製表符

   4.反向匹配:

     ^

     示例:

       #ls a[^[:digit:]]?? //表示文件名的第二個字符不能是十進制數字;

      注意:當中括號中有^表示字符集反向匹配時,注意*的使用;因爲通配範圍可能會導致反向匹配失敗;

此類失敗是因爲bashglobbing是在貪婪模式下匹配的;

十、管道

 |

  管道通常用來連接多個命令的:將管道符號前面的命令的執行的輸出結果通過管道傳遞給管道符號後面的命令,讓後面的命令將前面的輸出結果當成參數使用;

 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/nullBlackHoleBitBucket(位桶)

   /dev/zero:泡泡機,吐零機;

  bash中的其他特殊符號:

   <<:here document ,此處文檔結束標記;(很常用)

   <<<:here string,此處字符串,結束標記;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章