Bash(Shell)基礎知識

shell,在英文中通常被翻譯成殼,但是在Unix以及Linux中,它有着自己的定義:用戶與操作系統之間完成交互式操作的一個接口程序。它爲用戶提供簡化了的操作。當然從shell出現到現在有很多不同的shell:由貝爾實驗室Bourne開發的Bourne Shell,簡稱shBill JoyC ShellDavid KornKorn Shell,簡稱KshGUNBorn Again Shell,簡稱bashLinux系統的默認的Shell程序);Zsh。值得一提的是,這麼多Shell中,Zsh的功能很強大,但是由於bash已經作爲了Linux系統中的默認shell,否則的話,我認爲Zsh可能會成爲Linux系統中的默認shell。當然了,你如果想要使用Zsh,可以在自己的Linux系統安裝。

Linux系統中,你如果想要查看都擁有哪些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

這裏有幾點需要注意的地方:1、除了/sbin/nologin以外,其他的shell都可以用來測試使用;2、在你想要更換shell時,並且你已經處在某個Shell中時,通過exit命令返回到bash時再進行切換。否則你會加大系統的負擔。

   Bash作爲Linux系統中默認的shell,是經常會用到的,那我們就來介紹一下Bash的特性:

一命令的別名——(自定義命令)

Alias

         定義或顯示別名。

格式:格式:alias [-p] [名稱[=] ... ]

注意:如果alias命令不帶任何選項和參數,則表示顯示所有已經定義並生效的別名設置;

# alias ALIAS=’COMMAND[OPTIONS]…  [ARGUMENT]…’

Unalias

 從別名定義列表中刪除每一個“名字”。

 格式:unalias[-a] 名稱 [名稱 ...]

[root@localhost ~]# alias a='mkdir -pv'
[root@localhost ~]# a /xuwenlong/nan
mkdir: 已創建目錄"/xuwenlong"
mkdir: 已創建目錄"/xuwenlong/nan"
[root@localhost ~]# unalias a
[root@localhost ~]# a /xuwenlong/nan
bash: a: 未找到命令...

注意:

無論使用alias還是unalias命令,其功能都會立即生效;此二命令的生命期僅爲當前shell的生命期;一旦註銷登錄,相當於關閉了bash,則使用這兩個命令定義或者刪除的別名操作會立即失效;

對於每個用戶來說,都有一個私有的bash的配置文件,就在用戶的家目錄中的一個隱藏文件,文件名爲“.bashrc”,主要功能就是用來保存命令的別名的定義;

 

注意:在對於此文件中的命令別名進行編輯並保存之後,在當前已經運行的bash中並不會立即生效,需要重新加載此文件才能使配置生效,以下兩種操作皆可實現:

1.重啓bash:註銷之後再次登錄即可;

2.執行文件中定義的命令:使用source或者.命令;

    Source/.

   在當前 shell 中執行一個文件中的命令。

   格式:Source或者. 文件名 [參數]

 

 

bash的快捷鍵

  Cctrl鍵;

Malt鍵;

Eesc鍵;

DELbackspse

  C-l:清屏是,相當於Clear命令;

  C-a:將光標跳轉至命令行編輯模式的行首;

  C-e:將光標跳轉至命令行編輯模式的行尾;

  C-k:刪除光標所在位置至行尾的內容;

  C-u:刪除光標所在位置至行首的內容;

  C-c:結束前臺進程;

  M-.:引用上一個命令中的最後一個參數;(Xshell中不好用)

  E,.:功能同M-.

 

 

三命令歷史

   Bash進程會保存其會話中的用戶曾經執行過得命令,以方便用戶重複執行某個命令操作;

   命令歷史包括兩個方面:

       1用戶曾經執行過的命令;

        2用戶曾經執行過的路徑;

 bash中有一個內置的變量——PATHPATH變量的值爲當前系統中所有的命令的文件的所在路徑的集合;

 

命令是如何被SHELL執行的?

         Bash會將命令行的內容按照空白字符進行切片,分析第一個切片內容:判斷第一個切片的內容是內部命令還是外部命令;如果是內部命令,則直接運行;如果是外部命令,先找hash表中的路徑緩存,如果有則直接執行;否則需要通過查找PATH變量中包含路徑中,是否有對應名稱的文件。



使用hash命令查看被記住的命令文件的路徑;

-r:清空hash表;

使用history命令查看被記住的命令的命令行參數;

   Displayor manipulate the history list.

   格式:history[-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]

   常用選項:

     -c:清空歷史緩衝區中的命令歷史記錄;

     -dOFFSET:刪除指定的歷史命令條目;

     [root@localhost~]# history
     1 ls
     2 cat
     3 history -d 1
     4 history
     [root@localhost~]# history -d 1
     [root@localhost~]# history
     1  cat
     2 history -d 1
     3 history
     4 history -d 1
     5 history

重複執行歷史緩衝區中的命令:

         COMMAND:重複執行歷史緩衝區中編號爲“NUMber”的命令;

STRING:重複執行歷史緩衝區中以“STRING”開頭的最後一次執行過得命令;

!?STRING:重複執行歷史緩衝區中包含了“STRING”的最後一次執行過得命令;

-NUMBER:重複執行歷史緩衝區中倒數第”NUMBER”條命令;

使用上、下箭頭可以從歷史緩衝區中調用命令,回車之後執行;

C-r:在歷史緩衝去中實施搜索,回車並執行對應命令;

$:在歷史緩衝區中調用最後一個命令的最後一個參數;

^:表示在歷史緩衝區中調用最後一個命令的第一個位置參數;

!:NUMBER:在歷史緩衝區中調用最後一個命令的第“NUMBER”位置參數;

NUMBERNUMBER:在歷史緩衝區中調用第“SEQUENCE”條命令中第“NUMBER”位置參數;

bash中與命令歷史相關的內置變量:

       HISTSIZE:歷史緩衝區中能夠保存的命令歷史的最大條目數量,默認1000

HISTFILSIZE~/.bash_history文件中能夠保存的最大條目數量,默認1000HISTTIMEFORMAT:在命令歷史緩衝區中,記錄歷史命令式,同時記錄命令執行的時間戳標記;可以使用date命令的FORMAT來表示時間的記錄格式;默認值爲空;

HISTCONTROL:控制命令歷史的記錄方式;

  ignoredups:忽略連續且相同的命令被記錄到歷史緩衝區;此爲默認值;

  ignorespace:以空白字符開頭的命令不會被記錄到歷史緩衝區;

  ignoreboth:上述兩種情況都不會被記錄到歷史緩衝區;0

 

 

四命令補全——TAB

包括兩個方面的內容:

  1.構成命令字符串的補全;

   參考PATH變量中的路徑,對命令進行補全;

   如果給出的字符串在PATH變量對應的路徑中唯一的,則直接補全命令;

   如果給出的字符串在PATH變量對應的路徑中是不唯一的,則bash給出提示;

  2.以及命令中參數所對應的字符串補全;

   根據給出的路徑進行補全:

    如果給出的字符串在給出路徑中對應的路徑中唯一的,則直接補全參數;

    如果給出的字符串在給出路徑中對應的路徑中是不唯一的,則bash給出提示;

 

 

五命令行展開

1 ~展開:

    ~:bash會自動將其展開爲當前登錄用戶的家目錄;

    ~STRINGbash會自動將其展開爲以“STRING”爲用戶名的用戶的目錄;

 

    ~+:調用bash的內置變量“PWD”的值;

    ~-:調用bash的內置變量“OLDPWD”的值;

2{}展開:

 在“{}”中,可以填充一個以“,”來分隔的路徑的列表,bash會將其展開爲多個獨立的路徑;

 

 

六命令的執行結果

bash中,命令的執行結果有兩種:

   1、執行命令的輸出結果;

   根據用戶的需求獲取到的命令執行的正常輸出結果;

   命令引用或命令替換:

    (波浪鍵英文輸入)` ` 相當於$()

      ``:反向單引號,反引號;                 

   2、執行命令的狀態返回值;        

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

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

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

   其中:

     0:表示命令執行成功;      

     1-255:表示命令執行失敗;

     1,2,127,是bash中內置的命令執行失敗的狀態返回值;

      1:表示一些小問題;

      2:表示嚴重問題;

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

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

 

七引用功能

   ‘’:強引用

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

   “”:弱引用

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

 

 

八轉義功能:

    \bash定義的轉義字符;大多數情況下“\”只能將其後面一個字符轉義;

    \COMMAND:取消定義過的命令別名,而使用命令本身的功能;

    [root@localhost~]# ls
    a  anaconda-ks.cfg  a.txt a.txt.bak  b  b.txt initial-setup-ks.cfg  test-       test-date+%F-%H  公共  模板  視頻  圖片  文檔  下載  音樂  桌面
    [root@localhost~]# \ls
    a  anaconda-ks.cfg  a.txt a.txt.bak  b  b.txt initial-setup-ks.cfg  test-        test-date+%F-%H  公共  模板  視頻 圖片  文檔  下載  音樂  桌面


 

 

 

Globbing——文件名通配符,簡稱爲globa

*:匹配任意長度的任意字符或字符串;(某些特殊位置的“.”字符不匹配)

?:匹配任意單個字符;(某些特殊位置的“.”字符不匹配)

[]:匹配指定範圍內的任意單個字符,必須匹配且只能匹配一個字符;

 指定範圍方法:

   1枚舉法:列出所有有效字符;

   2範圍指定:

    [0-9]:表示所有單個的十進制數字;

    [a-z]:a,A,bB….z

    [A-Z]:AbB…..zZ

   3bash內建字符集;

    [lower]:所有的小寫字母

    [upper]:所有的大寫字母

    [:alpha:]:所有字母,大小寫字母;

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

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

    [punct]:所有的符號

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

   4反向匹配

    ^:

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

注意:當中括號中有^表示字符集反向匹配時,注意“*”的使用;因爲“*的通配範圍可能會導致反向匹配失敗;此類失敗是因爲bashglobbing是在貪婪模式下匹配的;

   [root@localhostman]# ls -d man[0-9]
   man1  man2 man3  man4  man5 man6  man7  man8 man9
   [root@localhost~]# ls -d /etc/[pmr]*.conf
   /etc/man_db.conf  /etc/pbm2ppa.conf  /etc/request-key.conf                    /etc/mke2fs.conf  /etc/pnm2ppa.conf  /etc/resolv.conf
   /etc/mtools.conf  /etc/radvd.conf   /etc/rsyncd.conf

 

 

管道

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

WC

 wc - print newline, word, and bytecounts for each file

 格式:wc [OPTION]...[FILE]...

 常用選項:

     -c, --bytes:僅顯示文件中的字節數;

     -m, --chars:僅顯示文件中的有效字符的數量;

     -l, --lines:僅顯示文件的行數;

     -w, --words:僅顯示文件中字的數量;          

注意:

1一般來講,凡是被管道連接的命令,都應該能夠在執行成功之後完成命令結果的輸出,否則管道無意義;

2管道不是萬能的,有些場合沒辦法使用管道的;

 

  [root@localhost~]# wc a.txt
    10 10 145 a.txt
    [root@localhost~]# wc -c a.txt
    145 a.txt
    [root@localhost~]# wc -l a.txt
    10  a.txt
    [root@localhost~]# wc -w a.txt
    10  a.txt

 

 

十一輸入輸出重定向

         在使用計算機的時候,實現某個功能的主體是程序!

         程序=指令數據

         數據至關重要!

文件,IO——Input/OUTput

Linux系統中,能夠完成輸入和輸出功能的實體:文件

可以用於輸入的設備:文件

         鍵盤設備,文件系統中的常規文件、網卡設備、磁盤設備等;

可以用於輸出的設備:文件

         顯示器、文件系統中的常規文件、網卡設備、聲卡設備、磁盤設備等;

在內存中使用文件的方式是定義文件描述符,一個文件描述符就對應一個文件;

         0:表示標準輸入,stdin,凡是從鍵盤實現的輸入數據流;

         1:表示標準輸出,stdout,到顯示器的輸出數據流;

         3:表示標準錯誤,stderr,到顯示器的錯誤數據流;

輸入輸出重定向(IO重定向)

   採用非標準設備文件實現的IO操作;

   輸入重定向:

   <

 

  [root@localhost ~]# wc a.txt
1 1 4 a.txt
[root@localhost ~]# wc < a.txt
1 1 4

輸出重定向:

 >:覆蓋輸出重定向;

  [root@localhost ~]# catout_ridirect
  1
  [root@localhost ~]# echo 2> out_ridirect
  [root@localhost ~]# catout_ridirect
  2

保護鎖定

~]# set –C   //開啓防止意外覆蓋源文件開關(“>|”可以完成覆蓋重定向輸出的操作,而無需關心是否開始此開關)

  [root@localhost ~]# set –C
  [root@localhost ~]# echo 3> out_ridirect
  -bash: out_ridirect: cannotoverwrite existing file

~]# set +C   //關閉防止意外覆蓋源文件開關

>>:追加輸出重定向;

 

錯誤重定向:

         2>:覆蓋錯誤重定向;

         2>>:追加錯誤重定向;

 

合併標準輸出和標準錯誤的重定向:

COMMAND  {>|>>}  /PATH/TO/SOMEFILE 2>&1

[root@localhost~]# ls a.txt &> b.txt
[root@localhost~]# cat b.txt
a.txt
[root@localhost~]# rm -rf a.txt
[root@localhost~]# ls a.txt &> b.txt
-bash: b.txt:cannot overwrite existing file
[root@localhost~]# ls a.txt &>> b.txt
[root@localhost~]# cat b.txt
a.txt
ls: 無法訪問a.txt: 沒有那個文件或目錄


&>,&>>

特殊的設備文件:

/dev/nullBlackHoleBitBucket(位桶)

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


Bash中的其他特殊符號:

 <:here document,此處文檔,結束標記;

 

[root@localhost ~]# cat << new
> asd
> asdasdasd
> asdasdasdas
> adasdads
> new
asd
asdasdasd
asdasdasdas
adasdads

        

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


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