Lunix基礎入門--bash的基礎特性(五)


Bash的基礎特性:history命令

命令歷史:shell進程會其會話中保存此前用戶提交執行過的命令;

 [root@centos7 ~]# history

   定製history的功能,可通過環境變量實現:

     HISTSIZE:shell進程可保留的命令歷史條數

       [root@centos7 ~]# echo $HISTSIZE

       1000

     HISTFILE:歷史命令保存的文件

       [root@centos7 ~]# echo $HISTFILE

       /root/.bash_history

     HISTFILESIZE:歷史命令文件的大小

       [root@centos7 ~]# echo $HISTFILESIZE

       1000


命令用法:

  history [-c] [-d 偏移量] [n] 

  或 history -anrw [文件名] 

  或 history -ps 參數 [參數...]


選項:

  -d:刪除指定某條歷史命令

    [root@centos7 ~]# history -d 347

    [root@centos7 ~]# history -d 347 5(加入5的意思是從347條開始向後刪除5條)

  -c:清空命令歷史

    [root@centos7 ~]# history -c

  -w:從內存歷史命令中保存到文件

  -r:從文件歷史命令讀取到內存中

  history #:顯示最近的#條命令;


調用命令歷史列表中的命令:

  [root@centos7 ~]# !#:再一次執行歷史列表中的第#條命令;

  [root@centos7 ~]# !!:再一次執行上一條命令;

  [root@centos7 ~]# !STRING:再一次執行歷史命令中最近一個以string開頭命令;

    ~]# !tail


調用上一條命令的最後一個參數:

 1.ESC+.(點號):會補全最後一個參數

 2.!$:會補全最後一個參數

  [root@centos7 ~]# ll /etc/sysconfig/network-scripts/ifcfg-eno16777736

  [root@centos7 ~]# cat 按鍵(esc,.)

  [root@centos7 ~]# file !$

    file /etc/sysconfig/network-scripts/ifcfg-eno16777736

    /etc/sysconfig/network-scripts/ifcfg-eno16777736: ASCII text


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

  環境變量:HISTCONTROL

  [root@centos7 ~]# echo $HISTCONTROL

    ignoredups:忽略重複的命令;

    ignorespace:忽略以空白字符開頭的命令;

    ignoreboth:以上兩者同時生效;


  修改變量的值:

    NAME='VALUE'

    HISTCONTROL=ignorespace



Bash的基礎特性:命令/路徑補全

命令補全:

    shell程序在接收到用戶執行命令的請求,分析完成之後,最左側的字符串會被當作命令;

    命令查找機制:

      1.查找內部命令;

      2.根據PATH環境變量中設定的目錄,自左而右逐個搜索目錄下的文件名;

       [root@centos7 ~]# echo $PATH

       /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin


    給定的打頭字符串如果能唯一標識某命令程序文件,則直接補全;

     [root@centos7 ~]# ifcon(鍵入到此點擊“Tab”鍵會自動補全ifconfig命令)

    給定的打頭字符串如果不能唯一標識某命令程序文件,再擊tab鍵一次,會給出列表;

     [root@centos7 ~]# if(鍵入到此雙擊“Tab”鍵,由於不是唯一標識會返回關於if命令列表)

     if  ifcfg  ifconfig  ifdown  ifenslave  ifnames  ifstat  ifup


路徑補全:

    在給定的起始路徑下,以對應路徑下的打頭字串來逐一匹配起始路徑下的每個文件:

      tab鍵:

        如果能惟一標識,則直接補全;

        否則,再一次tab,給出列表;



Bash的基礎特性之:命令行展開

 ~:自動展開爲用戶的家目錄,或指定的用戶的家目錄;

  {}:可承載一個以逗號分隔的路徑列表,並能夠將其展開爲多個路徑(並且可以嵌套);

    例如:/tmp/{a,b} 相當於 /tmp/a /tmp/b


目錄管理類的命令:mkdir, rmdir

 mkdir:創建目錄命令(make directories)

   mkdir [OPTION]... DIRECTORY...

   選項:

     -p: 自動按需創建父目錄(創建z目錄,x|y目錄不存在,使用-p選項會自動創建x,y目錄);

       [root@centos7 ~]# mkdir -p /sh/x/y/z

     -v: verbose,顯示詳細過程;

       [root@centos7 ~]# mkdir -pv /sh/x/y/z

         mkdir: created directory ‘/sh’

         mkdir: created directory ‘/sh/x’

         mkdir: created directory ‘/sh/x/y’

         mkdir: created directory ‘/sh/x/y/z’

     -m MODE:直接給定權限;

       [root@centos7 ~]# mkdir -m 777 /sh

         drwxrwxrwx 2 root root 6 Feb 23 23:04 /sh/



 rmdir:刪除空目錄(remove empty directories)

   rmdir [OPTION]... DIRECTORY...

   選項:

     -p:刪除某目錄後,如果其父目錄爲空,則一併刪除之(此操作很危險);

       [root@centos7 ~]# rmdir -p /sh/a/b/c

       rmdir: failed to remove directory ‘/’: Device or resource busy

     -v: 顯示過程;


 tree命令:

   tree [options] [directory]

   選項:

     -L level:執行顯示的層級

       [root@centos7 ~]# tree -L 2 /etc/

       /etc/

       ├── adjtime

       ├── aliases

       ├── aliases.db

       ├── alternatives

       │   ├── ld -> /usr/bin/ld.bfd


基於之上特性和命令,來兩道題(解答在文章最後):

  問題1:如何創建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b

  問題2:如何創建a_c, a_d, b_c, b_d;

  問題3:創建如下目錄結構:

/tmp/mysysroot/

|-- bin

|-- etc

|   `-- sysconfig

|       `-- network-scripts

|-- sbin

|-- usr

|   |-- bin

|   |-- lib

|   |-- lib64

|   |-- local

|   |   |-- bin

|   |   |-- etc

|   |   |-- lib

|   |   `-- sbin

|   `-- sbin

`-- var

|-- cache

|-- log

`-- run



Bash的基礎特性:命令的執行狀態結果

命令執行的狀態結果:

  bash通過狀態返回值來輸出此結果:

    成功:0

    失敗:1-255

  命令執行完成之後,狀態返回值保存於bash的特殊變量$?中

    [root@centos7 ~]# echo $?


命令正常執行時,有的還回有命令返回值:

  根據命令及其功能不同,結果各不相同



Bash的基於特性:引用

  強引用:''

  弱引用:""

  命令引用:``


  引用命令的執行結果:

    $(Command):

     [root@centos7 ~]# mkdir $(date +%F)

    ``:

     [root@centos7 ~]# mkdir `date +%F`

     drwxr-xr-x  2 root root    6 Feb 25 07:51 2017-02-25


  注:兩種執行後的效果一樣,一般腳本規範美觀實用第一種方式



Bash基礎特性:快捷鍵


  Ctrl+a:跳至命令行首

  Ctrl+e:跳至命令行尾

  Ctrl+u:刪除行首至光標所在處之前的所有字符

  Ctrl+k:刪除光標所在處至行尾的所有字符(包括光標字符)

  Ctrl+l:清屏,相當於clear命令



Bash基礎特性:globbing

 

  globbing:文件名通配(整體文件名匹配,而非部分)


  匹配模式:元字符

    *:匹配任意長度的任意字符

        pa*, *pa*, *pa, *p*a*

        pa, paa, passwd(匹配到的)

     ?:匹配任意單個字符

        pa?, ??pa, p?a, p?a?

     []:匹配指定範圍內的任意單個字符

        有幾種特殊格式:

          [a-z], [A-Z], [0-9], [a-z0-9] (單指定a-z不區分大小寫)

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

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

          [[:alpha:]]:所有字母

          [[:digit:]]:所有數字

          [[:alnum:]]:所有的字母和數字

          [[:space:]]:所有空白字符

          [[:punct:]]:所有標點符號

     [^]:匹配指定範圍外的任意單個字符

       例:

         [^[:upper:]]

         [^0-9]

         [^[:alnum:]]


  練習1:顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現一位任意字符的文件或目錄;

  練習2:顯示/etc目錄下,以任意一位數字開頭,且以非數字結尾的文件或目錄;

  練習3:顯示/etc目錄下,以非字母開頭,後面跟一個字母及其它任意長度任意字符的文件或目錄;

  練習4:複製/etc目錄下,所有以m開頭,以非數字結尾的文件或目錄至/tmp/magedu.com目錄

  練習5:複製/usr/share/man目錄下,所有以man開頭,後跟一個數字結尾的文件或目錄至/tmp/man/ 目錄下;

  練習6:複製/etc目錄下,所有以.conf結尾,且以m,n,r,p開頭的文件或目錄至/tmp/conf.d/目錄下;


 解答:

    1.[root@test7_1 sh]# ls -d /var/l?[[:lower:]]

    2.[root@test7_1 sh]# ls -d /etc/[0-9]*[^0-9]

    3.[root@test7_1 sh]# ls -d /etc/[^a-z][a-z]*

    4.[root@test7_1 sh]# cp -r /etc/m*[^0-9] /tmp/magedu.com/

    5.[root@test7_1 sh]# cp -r /usr/share/man/man[0-9] /tmp/man/

    6.[root@test7_1 sh]# cp -r /etc/[mnrp]*.conf /tmp/conf.d/



Bash特性之:命令hash

 當執行命令時,首先會去hash緩存中查找,查找到會提取使用;未查找到纔會查找命令文件,並執行   hash命令只會記錄外部命令,內部命令是不會被記錄。


  緩存此前命令的查找結果:key-value格式

    key:搜索鍵

    value:值


    hash命令:

      hash:列出

      hash -d COMMAND(ls):刪除

      hash -r:清空



Bash的特性之:變量

  程序:指令+數據

    指令:由程序文件提供;

    數據:IO設備、文件、管道、變量


  程序也相當於:算法+數據結構

    算法:設計解決問題的路徑


  變量名+指向的內存空間=變量

  變量賦值:name=value

  變量類型:存儲格式、表示數據範圍、參與的運算

    編程語言:

      強類型變量:如C、C++...

      弱類型變量:bash屬於此類

        bash把所有變量統統視作字符型;

        bash中的變量無需事先聲明;相當於,把聲明和賦值過程同時實現;

          聲明:類型,變量名

  變量替換:把變量名出現的位置替換爲其所指向的內存空間中數據;

  變量引用方式:${var_name}, $var_name

  變量名:變量名只能包含數字、字母和下劃線,而且不能以數字開頭;

  變量名:見名知義,命名機制遵循某種法則;不能夠使用程序的保留字,例如if, else, then,          while等等;


  bash變量類型:

    本地變量:作用域僅爲當前shell進程;

    環境變量:作用域爲當前shell進程及其子進程;

    局部變量:作用域僅爲某代碼片斷(函數上下文);

    位置參數變量:當執行腳本的shell進程傳遞的參數;

    特殊變量:shell內置的有特殊功用的變量;

      $?:

        0:成功

        1-255:失敗


    本地變量:

      變量賦值:name=value

      變量引用:${name}, $name

        "":變量名會替換爲其值;

        '':變量名不會替換爲其值;

      查看變量:set

      撤銷變量:unset name

        注意:此處不需要變量引用;


    環境變量:

      變量賦值聲明:

        (1) export name=value

        (2) name=value

          export name

        (3) declare -x name=value

        (4) name=value

          declare -x name

        注:以上變量聲明只對當前shell及其子進程生效


      變量引用:${name}, $name


      注意:bash內嵌了許多環境變量(通常爲全大寫字符),用於定義bash的工作環境

      PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD


      查看環境變量:export, declare -x, printenv, env

      撤銷環境變量:unset name


    只讀變量:

      (1) declare -r name

      (2) readonly name


      只讀變量無法重新賦值,並且不支持撤銷;存活時間爲當前shell進程的生命週期,隨shell進       程終止而終止;



Bash特性之多命令執行

  分號(;)

    [root@test7_1 ~]#  COMMAND1; COMMAND2; COMMAND3; ...

    執行順序從左到右執行,沒有邏輯關係


  邏輯運算:

    運算數:真(true, yes, on, 1)

         假(false, no, off, 0)


    與(乘法):

      1 && 1 = 1

      1 && 0 = 0

      0 && 1 = 0

      0 && 0 = 0

    或(加法):

      1 || 1 = 1

      1 || 0 = 1

      0 || 1 = 1

      0 || 0 = 0

    非(取反):

      ! 1 = 0

      ! 0 = 1

    異或:

      不相同則爲1,相同則爲0


  短路法則:

    [root@test7_1 ~]# COMMAND1 && COMMAND2

      COMMAND1爲“假”,則COMMAND2不會再執行;

      否則,COMMAND1爲“真”,則COMMAND2必須執行;


    [root@test7_1 ~]# COMMAND1 || COMMAND2

      COMMAND1爲“真”,則COMMAND2不會再執行;

      否則,COMMAND1爲“假”,則COMMAND2必須執行;


    示例:

      [root@test7_1 ~]# ll /sh/mydata.txt || touch /sh/mydata.txt

      ls: cannot access /sh/mydata.txt: No such file or directory

      -rw-r--r-- 1 root root     0 Apr 16 21:03 mydata.txt


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