Lunix基础入门--bash的基础特性(五)


Bash的基础特性:history命令git

命令历史:shell进程会其会话中保存此前用户提交执行过的命令;算法

 [root@centos7 ~]# historyshell

   定制history的功能,可经过环境变量实现:编程

     HISTSIZE:shell进程可保留的命令历史条数centos

       [root@centos7 ~]# echo $HISTSIZE缓存

       1000bash

     HISTFILE:历史命令保存的文件数据结构

       [root@centos7 ~]# echo $HISTFILE编程语言

       /root/.bash_historyide

     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

相关文章
相关标签/搜索