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

-------------------------------------------------------------------

  ~]# history

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

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

      HISTFILE:持久保存命令历史的文件;

        .bash_history

      HISTFILESIZE:命令历史文件的大小;

    

    命令用法:

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

      或 history -anrw [文件名]

      或 history -ps 参数 [参数...]

      -c:清空命令历史;

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

      -r:从文件读取命令历史至历史列表中;

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

      history #:显示最近的#条命令;

    调用命令历史列表中的命令:

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

      !!:再一次执行上一条命令;

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

        注意:命令的重复执行有时候需要依赖于幂等性;

          

      调用上一条命令的最后一个参数;

        快捷键:ESC, .

        字符串:!$

      控制命令历史记录的方法:

        环境变量:HISTCONTROL

          ignoredups:忽略重复的命令;

          ignorespace:忽略以空白字符开头的命令;

          ignoreboth:以上两者同时生效;

        修改变量的值:

          NAME='VALUE'

命令补全:

-------------------------------------------------------------------

  shell程序在接受到用户执行命令的请求,分析完成之后,最左侧的字符串会被当做命令;

  命令查找机制:

    查找内部命令;

    根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;

  给定的打头字符串如果能唯一标识某命令程序文件,则直接补全,不能唯一标识某命令程序,再击一次tab键,会给出列表;

路径补全:

-------------------------------------------------------------------

  在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下的每个文件:

    tab:

      如果能唯一标识,则直接补全;

      否则,再一次tab,给出列表;

命令行展开:

-------------------------------------------------------------------

  ~:自动展开为用户的家目录,或指定用户的家目录;

  {}:可以承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;

    例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b

命令执行的状态结果:

-------------------------------------------------------------------

  bash通过状态返回值来输出此结果:

    成功:0

    失败:1-255

  命令执行完成之后,其状态返回值保存于bash的特殊变量$?中;

  命令正常执行时,有的还会有命令返回值:

    根据命令及其功能不同,结果各不相同;

  引用命令的执行结果:

    $(COMMAND)

    或`COMMAND`

引用

-------------------------------------------------------------------

  强引用:''

  弱引用:""

  命令引用:``

快捷键

-------------------------------------------------------------------

  Ctrl+a:跳转至命令行行首

  Ctrl+e:跳转至命令行行尾

  Ctrl+u:删除行首至光标所在处之间的所有字符

  Ctrl+K:删除光标所在处至行尾的所有字符

  Ctrl+l:清屏,相当于clear

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

-------------------------------------------------------------------

  匹配模式:元字符

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

    ?:匹配任意单个字符

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

      有几种特殊格式:

        [a-z] [A-Z] [0-9] [a-z0-9]

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

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

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

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

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

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

        [[:punct:]]:

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

      [^[:upper:]]

      [^0-9]

      [^[:alnum:]]

IO重定向及管道

-------------------------------------------------------------------

  可用于输入的设备:文件

    键盘设备、文件系统上的常规文件、网卡等;

  可用于输出的设备:文件

    显示器、文件系统上的常规文件、网卡等;

  程序的数据流有三种:

    输入的数据流:<-- 标准输入(stdin),键盘

    输出的数据流:--> 标准输出(stdout),显示器

    错误输出流:   --> 标准输出(stderr),显示器

  fd:file descriptor,文件描述符

    标准输入:0

    标准输出:1

    错误输出:2

  IO重定向:

    输出重定向:>

      特性:覆盖输出

    输出重定向:>>

      特性:追加重定向

    # set -C

      禁止覆盖输出重定向至已存在的文件;

      此时可使用强制覆盖输出:>|

    # set +C

      关闭上述特性

  

    错误输出流重定向:2>, 2>>

    合并正常输出流和错误输出流:

      (1) &>, &>>

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

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

    输入重定向: <

    Here Document: <<

      cat <<EOF

      cat >> /PATH/TO/SOMEFILE << EOF

    管道:连接程序,实现前一个命令的输出直接定向到后一个程序的输入

tr命令:

  tr [OPTION]... SET1 [SET2]

    把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符

    用法1:

      tr SET1 SET2 < /PATH/FROM/SOMEFILE

    用法2:

      tr -d SET1 < /PATH/FROM/SOMEFILE

  

    注意,不修改原文件    

    

tee命令:

  COMMAND | tee /PATH/TO/SOMEFILE

  

bash特性之:命令hash

  缓存此前命令的查找结果:key-value
    key:搜索键
    value:值

  hash命令:
    hash:列出
      hash -d COMMAND:删除
      hash -r:清空

bash的特性之:变量
  程序:指令+数据
    指令:由程序文件提供;
    数据:IO设备、文件、管道、变量

  

  程序:算法+数据结构

  变量名+指向的内存空间

  变量赋值:name=value

  变量类型:存储格式、表示数据范围、参与的运算  

    编程语言:
      强类型变量:
      弱类型变量:

        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
      变量引用:${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特性之多命令执行:
  ~]# 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

  短路法则:
    ~]# COMMAND1 && COMMAND2
      COMMAND1为“假”,则COMMAND2不会再执行;
    否则,COMMAND1为“真”,则COMMAND2必须执行;

    ~]# COMMAND1 || COMMAND2
      COMMAND1为“真”,则COMMAND2不会再执行;
    否则,COMMAND1为“假”,则COMMAND2必须执行;

    示例:~]# id $username || useradd $username

bash脚本编程之算术运算

  +,-,*,/, **, %

  算术运算格式:
    (1) let VAR=算术运算表达式
    (2) VAR=$[算术运算表达式]
    (3) VAR=$((算术运算表达式))
    (4) VAR=$(expr $ARG1 $OP $ARG2)

    注意:乘法符号在有些场景中需要使用转义符;

   练习:写一个脚本,完成如下功能:
    添加三个用户;
    求此三个用户的UID之和;

信号捕捉:
        列出信号:
            trap  -l
            kill  -l
            man  7  signal
         
            trap  'COMMAND'  SIGNALS
             
            常可以进行捕捉的信号:
                HUP, INT
             
            示例:
                #!/bin/bash
                #
                declare -a hosttmpfiles
                trap  'mytrap'  INT
 
                mytrap()  {
                    echo "Quit"
                    rm -f ${hosttmpfiles[@]}
                    exit 1
                }
 
 
                for i in {1..50}; do
                    tmpfile=$(mktemp /tmp/ping.XXXXXX)
                    if ping -W 1 -c 1 172.16.$i.1 &> /dev/null; then
                        echo "172.16.$i.1 is up" | tee $tmpfile
                    else
                        echo "172.16.$i.1 is down" | tee $tmpfile
                    fi
                    hosttmpfiles[${#hosttmpfiles[*]}]=$tmpfile
                done
 
                rm -f ${hosttmpfiles[@]}
                 
    在bash中使用ACSII颜色
        \033[31m hello \033[0m
            ##m:
                左侧#:
                    3:前景色
                    4:背景色
                右侧#:颜色种类
                    1, 2, 3, 4, 5, 6, 7
             
            #m:
                加粗、闪烁等功能;
                 
            多种控制符,可组合使用,彼此间用分号隔开;
             
    dialog命令可实现窗口化编程;
        各窗体控件使用方式;
        如何获取用户选择或键入的内容?
            默认,其输出信息被定向到了错误输出流;
         
    《高级bash编程指南》,《Linux命令行和shell脚本编程宝典》

【Linux】【Shell】【Basic】Bash的更多相关文章

  1. 【Linux下自定义Shell终端提示符】

    目录 基本转义符 字体颜色 背景颜色 移动光标 @ Linux系统终端提示符的特征由系统环境变量 PS1(Prompt String One)定义. 我们可以通过命令echo $PS1来查看当前设置, ...

  2. 【linux之挂载,Raid,LVM】

    一.挂载,卸载 挂载:将新的文件系统关联至当前根文件系统卸载:将某文件系统与当前根文件系统的关联关系移除 cat /etc/mtab 存储着已经挂载的文件系统 (跟 mount 一样) mount:显 ...

  3. 【Linux&amp;Unix--open/close/write/read系统调用】

    个人学习整理.如有不足之处,请不吝不吝赐教. 转载请注明:@CSU-Max 系列博文:      Linux&Unix学习第一弹 -- 文件描写叙述符与权限  Linux&Unix学习 ...

  4. 【linux之设备,分区,文件系统】

    一.设备 IDE磁盘的设备文件采用/dev/hdx来命名,分区则采用/dev/hdxy来命名,其中x表示磁盘(a是第一块磁盘,b是第二块磁盘,以此类推), y代表分区的号码(由1开始,..3以此类推) ...

  5. 【linux之进程管理,系统监控】

    一.进程管理 前台进程:一般是指占据着标准输入和/或标准输出的进程后台进程:不占据默认开启的进程都是前台进程ctrl+C 中断ctrl+z 从前台转入后台bg 后台进程编号 让其在后台运行ls -R ...

  6. 【python中调用shell命令使用PIPE】使用PIPE作为stdout出现假卡死的情况——将stdout重定向为输出到临时文件

    在Python中,调用:subprocess.Popen(cmd, stdout = PIPE, stderr = PIPE, shell= true)的时候,如果调用的shell命令本身在执行之后会 ...

  7. 【Linux运维-集群技术进阶】Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群

    额.博客名字有点长.. . 前言 最终到这篇文章了,心情是有点激动的. 由于这篇文章会集中曾经博客讲到的全部Nginx功能点.包含主要的负载均衡,还有动静分离技术再加上这篇文章的重点.通过Keepal ...

  8. 【Linux磁盘优化管理--RAID和LVM】

    在现阶段的企业环境中,为了数据的安全性及完整性必须要有一个合理的存储方案.面对着每秒可能产生超过几TB的数据,考虑到磁盘能不能实现 热冗余,及扩容,缩容.Linux给出了RAID(磁盘阵列)以及LVM ...

  9. 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)

    原文:http://blog.csdn.net/wenqian1991/article/details/46700177 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关 ...

  10. 【linux之链接,函数,随机数】

    一.链接 硬链接(hard link):同一个文件使用了多个别名.新建文件是已经存在的一个别名,,当原文件删除时,新建的文件仍然可以使用.硬链接和原来的文件没有什么区别,而且共享一个inode号.通过 ...

随机推荐

  1. 如何用LOTO示波器安全的测量高电压?

    本文里我们把几十伏以上,超出对人体安全电压或者超出示波器量程的电压定为高电压,以220V市电举例讨论. 示波器上是有方便自测和探头补偿用的标准方波的,一般是1K Hz.我们的USB示波器上也有这个标准 ...

  2. CCCC-exercise

    CCCC-exercise 1.L1 总结L1 1-27里面我觉得有东西可以总结的题目 贴了部分的代码 L1-006(20) 一个正整数 N 的因子中可能存在若干连续的数字.例如 630 可以分解为 ...

  3. requests之代理的使用

    import requests # 访问url url = 'http://www.baidu.com/s?' # 请求头 headers = { 'User-Agent': 'Mozilla/5.0 ...

  4. 微信小程序(七)

    组件: 组件是视图层的基本组成单元 组件自带一些功能与微信风格的样式 一个组件通常包括:开始标签和结束标签,属性用来修饰这个组件,内容在两个标签之内. 媒体组件 地图 开放能力 画布 视图容器 vie ...

  5. 解决异常:“The last packet sent successfully to the server was 0 milliseconds ago. ”的办法

    出现异常"The last packet sent successfully to the server was 0 milliseconds ago."的大部分原因是由于数据库回 ...

  6. [cf1458C]Latin Square

    维护$n^{2}$个三元组$(x,y,z)$,每一个三元组描述$a_{x,y}=z$ 对于RLDU这四个操作,即将所有三元组的$x$或$y$执行$\pm 1$(模$n$意义下) 对于IC这两个操作,即 ...

  7. [hdu6601]Keen On Everything But Triangle

    有两个结论:1.排序后,答案一定是连续的三个数:2.当序列长度超过44一定有三个相同的数(因为即使该序列是斐波那契数列,此时也超过了1e9),然后用主席树等数据结构(略卡常,建议主席树)来维护前45大 ...

  8. [cf1349E]Slime and Hats

    首先,当发现全场不存在黑色帽子时,显然所有人都知道其是白色帽子,即必然离开 当第一轮时,若第$n$个人发现前面$n-1$个人全是白色时,其自己必然是黑色,必然离开 而第二轮时,若第$n-1$个人发现$ ...

  9. 深度学习,机器学习神器,白嫖免费GPU

    深度学习,机器学习神器,白嫖免费GPU! 最近在学习计算机视觉,自己的小本本没有那么高的算力,层级尝试过Google的Colab,以及移动云的GPU算力,都不算理想.如果数据集比较小,可以试试Cola ...

  10. Redis分布式缓存剖析及大厂面试精髓v6.2.6

    概述 官方说明 Redis官网 https://redis.io/ 最新版本6.2.6 Redis中文官网 http://www.redis.cn/ 不过中文官网的同步更新维护相对要滞后不少时间,但对 ...