bash特性

一、命令历史

    概念:shell进程能够将之前执行过的命令保存记录下来

    存储位置:

        1、命令历史的文件

            使用以下环境变量查看相关参数:

                HISTFILE:查看文件地址(一般为.bash_histroty)    

               bash特性clipboard.png

                HISTFILESIZE:命令历史文件的大小

               clipboard2.png

        2、当前shell进程中,相当于内存缓存吧

            使用以下环境变量查看相关参数:

                HISTSIZE:可保留命令的历史的条数

               

    查看命令历史:~] history

        用法:

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

            或 history -anrw [文件名]

            或 history -ps 参数 [参数…]

            -c:清空命令历史

            -d offset:删除指定命令历史

            -r : 从文件读取命令历史追加至历史文件中

            -w:把历史列表中的命令追加至历史文件中

            histroy #:显示最近的#条命令

           clipboard3.png

            

    调用历史列表中的命令:

        !#:再一次执行历史列表中的第#条命令;

        !!:再一次执行上一条命令,也可以用向上箭头;

        !STRING:再一次执行命令历史列表最近一个以STRING开头的命令;

            注意:命令的重复执行有时候需要依赖于幂等性(个人通俗理解,就是多次执行的结果都一样)

    有时候需要重复使用上一条命令的最后一个参数:

        快捷键:ESC,.(先按以下ESC,松开后紧接着按下.)

        或输入字符串 !$ 即可代替上一条命令的最后一个参数

    命令记录的一个特性:

        是否记录重复,是否记录空白字符开头的

        使用环境变量HISTCONTROL控制

            1、ignoredups:忽略重复

            2、ignorespace:忽略空白字符开头的

            3、ignoreboth:两者都忽略

二、命令补全

    为了提高用户的体验,能够简单准确地调用命令,当用户输入命令的部分字符时,可以敲tab建,shell会把已输入的字符作为开头去匹配命令,如果匹配到就补全这个命令。如果匹配到了多个或没有匹配到则不显示,这时候则可以再敲一次tab键,如果有匹配到多个,就会列出匹配到的命令以供选择。如果没有匹配到,则依然不显示。

    

    路径补全,同命令补全。

   clipboard5.png

三、命令行展开

    命令行展开是针对于命令中需要输入多个路径时的一种合并简单写法

    

    ~:此符合作为路径时会自动展开(替换)为用户家目录,或指定用户家目录

    {}:大括号里以逗号分隔的多项字符,会分别与大括号左后的内容进行拼接成多个路径;

        例如:/tmp/{a,b}/d 会展开为两个路径:/tmp/a/d /tmp/b/d

   clipboard6.png       

 

四:命令执行状态结果

    每条命令的执行结果都有一个对应的状态码,也成为退出码

        0:成功

        1-255:表示不同的失败

        

        深入说明参考:

        http://teliute.org/linux/abs-3.9.1/exitcodes.html

        

    

    有的命令正常执行,也会返回一些执行结果。

        返回结果,跟返回码的区别

            返回码只是命令的执行成功与否。

            结果是状态执行完毕产生的一些数据输出。

       

    用特殊变量 $? 可以查看上一条执行命令的返回码。

    clipboard7.png

    执行结果的引用:

        $(COMMAND)

        `COMMAND`    

   clipboard8.png

    

五、快捷键

    Ctrl+a:跳转到命令行的行首

    Ctrl+e:跳转到命令行的行尾

    Ctrl+u:删除光标位置到行首之间的字符

    Ctrl+k:删除光标位置到行尾之间的字符

    Ctrl+l:清屏

六、globbing(文件名通配,匹配的整体,也就是完全符合通配符)

    匹配模式:元字符

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

        ?:匹配任意单个字符

        []:匹配指定范围内的任意单个字符

            下面是几种特殊格式,他们代表某类字符组:

            1、[a-z],[A-Z],[0-9],[a-z0-9]

            2、[[:upper:]]:所有大写字母

            3、[[:lower:]]:所有小写字母

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

            5、[[:digit:]]:所有数字

            6、[[:alnum:]]:所有数字和字母

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

            8、[[:punct:]]:所有标点字符

        [^]:匹配制定范围外的任意单个字符

            如:[^[:upper:]]所有非大写字母

    clipboard9.png

七、IO重定向

    每个程序的执行都有输入数据和输出数据,程序的数据流有三种:

        (1)、输入的数据流:<– 标准输入(stdin), 数据来源:键盘;

        (2)、输出的数据流:–> 标准输出(stdout),数据去向:显示器;

        (3)、错误的输出流:–> 错误输出(stderr),数据去向:显示器;

    (一)、IO

        概念:输入输出

        [一]、输入 input

            设备:文件、键盘、网卡等;

        [二]、输出 output

            设备:文件、显示器、网卡、打印机等;

    (二)、重定向:也就是改变数据流的来源或去向。

        [一]、多个命令时管道链接数据流入流出

            概念: 

                链接命令,将前一个程序执行的结果直接定向到后一个程序当做输入数据流

            用法:

                COMMAND1 | COMMAND2 | COMMAND3 | …

        clipboard10.png

            特殊用法:

                tee命令:

                    经常用在两个管道之间,将输入的数据接收保存到文件中,并把输入数据再次原样接力输出。

                tee /PATH/TO/SOMEFILE

           clipboard11.png

            

        [二]、三种数据流分别对应的重定向方式:

            █  标准输出:

                > /PATH/TO/SOMEFILE

                >> /PATH/TO/SOMEFILE                 

                区别:是否覆盖已存在的文件,> 覆盖文件,>> 追加文件中

                可以设置是否允许覆盖

                    set -C: 不允许 > 覆盖,但仍然可以用 :> 强行覆盖

                    set +C: 关闭上述特性

            clipboard12.png   

            █  错误输出:

                2> /PATH/TO/SOMEFILE

                2>> /PATH/TO/SOMEFILE

               clipboard13.png

            

                合并以上两种输出到一个目标文件:

                    (1)、&>, &>>

                    (2)、

                        COMMAND > /path/to/somefile 2>&1

                        COMMAND >> /path/to/somefile 2>&1

               clipboard14.png

            clipboard15.png

                    

        

            █  输入:

                <

                    通常用在一些被动接收输入数据的命令上。如tr、cut等。

               clipboard16.png      

                Here Document: 

                    << 文档输入模式,定义一个起始和结束符。例如以下在定义的特殊字符EOF后可以随意输入,所以换行,直到出现最后一行EOF字符结束输入

                        cat << EOF

                        cat /PATH/TO/SOMEFILE << EOF

               clipboard17.png     

八、命令hash

    概念:

        之前介绍过shell执行命令调用时,会在环境变量PATH所保存的目录下依次查找对应二进制程序。找到并调用之,但是每次查找会耗时,为了减轻耗时,会把调用过的命令缓存起来,加速命令调用。

    存储格式:

        键值对:比如你使用了次命令ls,那么会存一条: ls –> /usr/bin/ls

    查看方法:

        hash:默认列出存储的hash值,

            -l,列出详细信息

            -d COMMAND :删除某条命令的缓存

            -r:清空

    clipboard18.png

九、bash的变量

    概念:

        个人有编程经验,暂时不做解释

    变量类型:

        bash按个人理解应该属于弱类型变量,bash会把所有变量统统视为字符串;

        既然是弱类型,无需声明,直接赋值使用即可。

    变量名规则与规范:

        只能包含数字、字母、下划线

        不能以数字开头

        不能使用编程语言的自身保留字

        最好见名知义,明确表明变量所代表的意义

    变量替换:

        把命令中引用的变量,替换为对应内存空间上的数据。

       clipboard19.png 

    作用范围:

        本地变量:作用域为当前shell进程

        环境变量:作用于为当前shell及其子进程

        局部变量:作用于为代码片段(比如函数内的变量)

        特殊变量:shell内置具有特殊功能的变量

            $?:前面说过,表示命令执行返回状态码。

        注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境

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

    变量声明:

        name=value

            默认为本地变量,在函数体内声明就是局部变量(纯属个人猜测),如需设为环境变量,需要导出为全局变量。

            声明为环境变量:

                (1)、export name=value

                (2)、name=value

                     export name

                (3)、declare -x name=value

                (4)、name=value

                     declare -x name

    变量引用:

        ${var_name}    当引用有歧义时,可用大括号表明

        $var_name

       clipboard20.png

    查看变量:(列出当前shell可用变量,并非引用)

        查看所有变量

            set

        查看环境变量

            export, declare -x, printenv, env

    撤销变量:

        unset name

    只读变量: 

            (1) declare -r name=value

            (2) readonly name=value

            只读变量无法重新赋值,并且不能撤销,声明周期为当前shell的生命周期,随shell的终止而终止。

十、多命令执行

    (一)、按顺序执行

        COMMAND1; COMMAND2; COMMAND3; …

    (二)、逻辑控制执行

        COMMAND1 && COMMAND2

        COMMAND1 || COMMAND2

十一、bash的配置文件

    配置文件的意义:

        命令行中定义的特性,例如变量和别名作用域为当前shell生命期;那么配置文件定义的特性只对以后新启动的shell都有效。

    修改配置文件,立即对当前shell生效

        1、通过命令行重新定义一次

        2、让shell重新读取配置文件

            ~] source /PATH/FROM/CONF_FILE

            ~] . /PATH/FROM/CONF_FILE

    按登录类型分:

        ■ profile类:为交互式登录的shell提供配置

            交互式登录:

                1、直接通过某终端输入账号密码登录后打开的shell进程

                2、使用su命令:su – USERNAME或 su -l USERNAME 执行的登陆切换。

            功用:

                1、用于定义环境变量

                2、运行命令或脚本

            作用范围:

                1、全局:对所有用户都生效;

                    /etc/profile

                    /etc/profile.d/*.sh

                2、用户个人:对当前用户有效

                    ~/.bash_profile

                 clipboard21.png

             clipboard22.png

                 

        ■ bashrc类:为非交互式登录的shell进程提供配置

            非交互式登录:

                1、su USERNAME执行的命令切换

                2、图形界面下打开的终端

                3、运行脚本

            功用:

                1、定义本地变量

                2、定义命令别名

            作用范围:

                1、全局

                    /etc/bashrc

                用户个人:

                    ~/.bashrc

        注意:只有管理员可以修改全局配置

    交互式登录shell进程加载配置文件的过程:

        /etc/profile –> /etc/profile.d/* –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc

    非交互式登录shell进程加载配置文件的过程:

        ~/.bashrc –> /etc/bashrc –> /etc/profile.d/*

原创文章,作者:小江,如若转载,请注明出处:http://www.178linux.com/38876

(0)
小江小江
上一篇 2016-09-19
下一篇 2016-09-19

相关推荐

  • Linux发展史

    Linux发展史 一、历史 (一)、Unix 1、Unix操作系统是一个强大的多用户、多任务操作系统,支持多种处理器架构。 2、最早由KenThompson(汤普逊)、Dennis Ritchie(丹尼斯·里奇,C语言之父,Unix之父)和Douglas McIlroy(麦克罗伊,程式设计师)于1969年在AT&T的贝尔实验室开发。 3、目前它的商标…

    Linux干货 2016-10-14
  • N22-第一周博客作业

    1、计算机的组成和及其功能? 计算机由硬件,操作系统,软件三大部分组成。 硬件: 计算机系统中所使用的电子线路和物理设备,主要由中央处理器( CPU )、存储器、外部设备(输入输出设备、I/O设备)及总线等组成。 a、中央处理器(CPU)的主要功能是根据存储器内的程序 ,逐条地执行程序所指定的操作。中央处理器的主要组成部分是:数据寄存器、指令寄存器、指令译码…

    Linux干货 2016-08-15
  • DNS服务器搭建示例

    DNS服务器搭建示例 负责解析magedu.com域名,能够对一些主机名进行正向解析和逆向解析 配置主配置文件 [root@slave1 etc]# vim /etc/named.conf options { listen-on port 53 { 192.168.91.132; }; // listen-on-v6 port 53 { ::1; }; di…

    2017-09-16
  • N26-博客作业-week11

    1、详细描述一次加密通讯的过程,结合图示最佳。 加密过程 1、先用单向加密算法计算出数据的特征码 2、私钥加密特征码,并将结果附加在数据之后 3、生成一个临时的对称密钥,并使用对称密钥加密整段数据 4、获取对方的公钥,使用该公钥加密之前生成的临时对称密钥,并附加在数据之后 5、将所有数据发送给对方解密过程 1、先使用私钥解密加密的对称密钥 2、用对称密钥解密…

    2017-04-18
  • 记一次CentOS7内核kernel的删除重装

    人生在于折腾,学习Linux更要多多折腾。在一次折腾中吸取教训,更易于记忆。 今天我们来折腾Linux的内核:删除系统内核后,通过光盘进行kernel的重安装。 友情提示:请在虚拟机环境进行,折腾前务必做好系统快照。慎重! 环境 本次系统环境是如下图: 删除 我们先到/boot目录下,强制删除kernel文件: 重启PC,此时系统报错找不到内核文件,无法登录…

    Linux干货 2016-08-24
  • Linux进程查看及管理(2)

    Linux进程查看及管理(2) CentOS5和6的启动流程: Liunx中的启动:kernel和rootfs(根文件系统) kernel:进程管理,内存管理,网络管理功能,驱动程序,文件系统,安全功能(权限模型), rootfs:glibc(lib,lib64) 库:函数集合,function(功能模块)有其调用接口(头文件是对函数功能或调用参数的功能进行…

    Linux干货 2016-08-08