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

相关推荐

  • bash 循环语句for、while、until

    循环执行 循环执行     定义:将某段代码有次数或无次数循环执行多次。     构成要素:退出条件和进入条件     循环的三种语句:for、while、until for循环:      &nbs…

    Linux干货 2016-08-21
  • 对ssh的简单理解

    ssh:secure shell,protocol,22、tcp安全的远程登录 具体的软件实现:openssh:ssh协议的开源实现,centos默认安装dropbear:另一个开源实现ssh协议版本v1:基于crc-32做MAC,不安全;man-in-middle 已淘汰v2:双方主机协议选择安全的MAC方式基于DH算法做密钥交换,基于RSA或DSA实现身…

    2017-09-29
  • 单引号、双引号和反引号使用方法

        首先向马哥和马哥团队敬个礼,谢谢你们带我进入Linux的世界,刚开始接触linux时,经常看到单引号、双引号和反引号特殊符号,经常搞混淆和误用,应该用双引号,有时用到单引号。经过几天的混乱引用,总算搞明白了一些,简单总一下三者的使用和区别。  单引号 ‘’     单引号里的内容全部以普通字符的含义进…

    Linux干货 2015-07-29
  • Linux系统认知

    前言 在认识Linux系统之前先介绍下计算机的组成构造及其功能: 1,简单来说计算机可以划分为软件系统和硬件系统: (1)软件系统自不必说就是各种不同的程序,协助用户更好地使用电脑。 (2)硬件系统指的是主机、显示器、鼠键等硬件设备。 2,按冯诺依曼体系可将计算机按逻辑构成分为: (1)CPU(运算器、控制器)。运算器是数据处理装置,用来完成对数据的算术运算…

    Linux干货 2016-09-20
  • 关于nginx状态监控字段的个人见解(求真相)

    今天看到了马哥视频其中一节对nginx状态监控信息的介绍,对视频ppt上的监控字段解析产生了一些疑问,ppt内容如下: active connections – 活跃的连接数量server accepts handled requests — 总共处理了xxx个连接 , 成功创建xxx次握手, 总共处理了xxx个请求reading — 读取客户端的连接数.w…

    Linux干货 2016-07-12
  • 简单的shell脚本第二版

    经过各位老板的指点我修改了部分内容使其更加完善        原文链接  http://www.178linux.com/70381 /bin/bash declare -i Inet declare -i Snet [[ $1 =~ ((2[0-4][0-9]|25[0-5]|1?[0-9]?[0…

    Linux干货 2017-03-19