首页 > 技术文章 > bash复习笔记

choyaooo 2017-12-09 15:21 原文


Bash特性之一:

1、命令行展开:能够把一个特殊字符换成别的字符
    {,}展开为多个条目,例如 mkdir /home/{od,a,b} (注意不能有空格)
2、文件和目录管理类的命令
      目录:
      cd ~[username]
      ~:指定用户的家目录
      cd -:回到上一次所在的目录
    路径:
     相对路径中:
     .:当前目录
     ..:父目录
    pwd: print working directory 显示当前目录
    mkdir:创建目录
    -p:先创建父目录
    -v:显示详细信息
    rmdir:删除空目录
     -p:只能删除一线单的目录
    
3、shell的引用:
    ‘’:强引用,变量替换不会进行
    "":弱引用,能够执行变量替换
    ``:命令替换,引用命令的执行结果,另外一种方式$()
    变量替换:${变量名}
    echo 显示


Bash的特性之二:命令历史

1、bash默认会保持此前执行过的命令列表
    当前shell进程的保存在缓冲区中,缓冲区中的命令会在shell退出的保存在文件中 .bash_history。
    可以使用上下箭头键可以翻看此前执行过的命令。
    history:
        !数字:执行history中第数字条的命令
        !!:上一条命令
        !-数字:表示执行命令列表中的倒数第数字条命令
        !$:执行上个命令中的最后一个参数:ESC,.
        !string:执行命令列表中的最近一次以string开头的命令
        -d 数字 删除第数字条记录
        -c 清空history列表
        -a:追加当前回话的命令到历史列表中去
        -n:读取所有在回话列表中的 但是不在当前回话列表中的
2、命令历史相关的环境变量
    HISTSIZE:历史命令中可以保存的个数
    HISTFILE: 历史命令保存的文件
    HISTFILESIZE:历史文件中可以保存的命令个数
    HISTCONTROL:控制命令历史的生成机制
            ignoredups:忽略记录重复的命令,连续的相同命令
            ignorespace:以空格开头的命令不会被记录
             ignoreboth:同时具有上面两种特性

    补充点:
    1、Linux文件系统的另一个特性:以点开头的文件为隐藏文件 通过ls -a 查看
    2、shell中的变量赋值
         注意:    1、变量在赋值是不能再前面带$
                2、变量名只能包含字母、数字和下划线,并且不能以数字开头
                3、变量名区分大小写
                4、尽量能见名知义

Bash的特性之三:命令别名
    alias:当前shell中定义的所有别名(任何随进程而生的属性,会在进程结束,属性消失)
    命令使用:
      alias 别名=‘原始命令’
      unalias 别名 取消定义的别名
     在命令前加\使用命令本身,而不是别名


Bash特性之四:常用命令
    1、file FILE..:查看文件内容的格式
    2、cat:将文本连接起来显示在标准输出上
      -E --show-ends 显示结束符$
      -e:等于-vE
      -v:显示非打印符
      -n:显示每行按顺序编号
      -s:将多个连续的空白行合并显示一个空白行
    3、tac:逆序显示文件 (分屏显示)
    4、more:只支持向后翻(文件尾部以后)
    5、less:支持前后翻
    6、head:
        -n #:显示前多少行
    tail
        -n # 显示后多少行
        -f:实时监控文件尾部变化

    7、 echo命令的用法:
       -e  “处理特殊字符”
        \a 发出警告声;
        \b 删除前一个字符;
        \c 最后不加上换行符号;
        \f 换行但光标仍旧停留在原来的位置;
        \n 换行且光标移至行首;
        \r 光标移至行首,但不换行;
        \t 插入tab;
        \v 与\f相同;
        \\ 插入\字符;
        \nnn 插入nnn(八进制)所代表的ASCII字符;
        \033[字背景颜色;文字颜色m  string\033[0m"
    -n:  不为显示内容自动换行,即不换行输出

8、文件操作
    cp 复制命令
    cp命令的常用选项:
        -r:递归
        -i:提示,交互
        -f:强制覆盖
        -a: -dr 保留所有的文件信息
        -d:当源为链接文件时,复制链接文件本身,而非指向的源文件
        -p:保持原有属性
    mv:移动,剪切,与cp相近,可以直接移动目录,不需要-r选项
    rm:移除,删除非空目录 rm -rf

    touch:用来修改时间戳,创建空文件
        -c:不创建空文件,只修改时间戳
        -t:指定时间戳
        -a:仅修改访问时间
        -m:仅修改修改时间
    先加-m,在加-t 后跟时间
    三种时间戳:
        access time atime 访问时间:被读取,被打开(最近一次)
        modify time mtime 修改时间:补充,修改或删除
        change time ctime 改变时间:指元数据被改变时间,(元数据:文件权限,大小,类型,存放位置,时间戳等)
 
    stat命令:显示文件元数据信息,详细信息
    stat FILE

Bash的特性五:globbing,文件名通配
    通配符:
        *:匹配任意长度的任意字符
        ?:匹配任意单个字符
        []:匹配指定字符范围内的任意单个字符,不区分大小写
        [[:upper:]]:大写字母
        [[:lower:]]:小写字母
        [[:alpha:]]:所有字母
        [[:digit:]]:所有数字
        [[:alnum:]]:字母+数字
        [[:space:]]:空格
        [[:punct:]]:标点符号 特殊字符
        [^]:匹配指定字符范围外的任意单个字符

Bash特性之六:命令行快捷键
    
    Ctrl+a:跳至命令行首
    Ctrl+e:跳至命令行尾
    Ctrl+u:删除命令行首至当前光标所在处的内容
    Ctrl+k:删除当前光标所在处至命令行尾的内容
    Ctrl+l:清屏,相当于clear命令
    Ctrl+c:终止或者取消命令
    Ctrl+z:将当前命令送至后台(fg调回命令)

Bash特性之七:补全功能
    补全功能,使用tab补全命令、路径,简化输入
      命令补全:在PATH中搜索补全
    PATH,一组以冒号分隔的路径         echo $PATH
      路径补全:在给出的打头路径下补全,如果没有打头路径,则为当前目录

Bash特性之八:提供编程环境
    1、初识shell编程
        #!/bin/bash被称为shebang

       2、变量的类型:
        本地变量
        局部变量
        环境变量
        位置变量
        特殊变量(内置)

    2.1、本地变量:
        varname=value:作用域为整个bash进程可以使用。

    变量命名规范:
        1. 只能含字母、数字和下划线,并且以字母和下划线开头
        2. 最好不要跟系统已有的环境变量重名
        3. 见名知意

        2.2、局部变量:
        local varname=value:作用域为当前代码段;

        2.3、环境变量:
        作用域为当前shell进程及其子进程,不能影响到其父进程;
        使用方法:
        1. export varname=value
        2. varname=value  ;    export varname
        脚本在执行命令时会启动一个子shell环境变量:

        2.4、位置变量:
        $1,$2,$3,……
        cat first.sh test.txt hello
        $1: first.sh
        $2: test.txt
        $3: hello
        shift:踢掉参数
        shift n:踢掉n个参数,默认踢掉一个参数

        2.5、特殊变量:
        $?:上一个命令执行状态的返回值:
        程序执行可能有两种返回值:
        1. 程序执行结果
        2. 程序状态返回吗(0-255)
        0 则为执行正确
        1-255 则执行出错(1,2,127系统预留);

        $#:获取当前shell命令行中参数的总个数
        $*:获取当前shell的所有参数 “$1 $2 $3 …,受IFS控制
        $@:这个程序的所有参数 “$1″ “$2″ “$3″ “…”,不受IFS控制
        $0 获取当前执行的shell脚本的文件名
        $n 获取当前执行的shell脚本的第n个参数值,n=1..9
        $$ 获取当前shell的进程号(PID)
        $! 执行上一个指令的PIDbash的配置文件:持久保存用户配置
        
        2.6 给变量赋予默认值:
        varName=${varName:-value}
        如果varName不空,则返回varName的值;否侧,则返回value
        如果varName不空,则其值不变;否则,varName会使用value作为其值
        
    3、系统环境变量配置文件
     3.1、profile类:为交互式登录的用户提供配置
        /etc/profile 全局
        /etc/profile.d/*.sh 全局
        ~/.bash_profile 个人配置,仅对当前用户有效
    功能:
        设定环境变量
        用来实现运行命令或者脚本
    系统读取配置文件过程:
        /etc/profile -->/etc/profile.d/*.sh -->~/.bash_profile-->~/.bashrc -->/etc/bashrc
    
    3.2、 bashrc类:非交互式用户登录提供配置
         /etc/bashrc:全局
        ~/.bashrc:个人配置
    功能:
       设定本地变量
       可以定义命令别名
    系统读取配置文件过程:
        ~/.bashrc -->/etc/bashrc -->/etc/profile.d/*.sh

    4、通知shell重读系统文件         
        source(.) 重读配置文件

Bash特性之九: for循环及文本处理类工具
    
    1、for循环:
    for var_Name in 列表; do
        循环体(正常执行的执行命令)
        语句1
        语句2
        语句3
        ...
    done
            
    2、列表的生成方法:
        1.直接给出列表  1 2 3 4 5 ...
        2.使用文件名通配的机制生成列表 /etc/*
        3.可以使用{}或seq命令生成数字序列
        生成数字列表:
            {start..end}
            seq[start] [step] [stop]
            seq 起始数字、步长,结束数字
        4.使用命令生成
            cat file_name (文件内容每行一个作为元素遍历)
    3、bash -n 脚本文件 检查脚本文件语法是否错误
    
    4、文本处理类的命令:wc,word count

        wc[option][file]...
            -l:统计行数
            -c:统计字节数
            -w:统计单词数
            
        tr:转换或删除字符
        格式:tr ‘集合1’ ‘集合2’,一般配合管道符使用
        -d:删除出现过的字符集
        实例:
        转换:
        # cat file | tr [A-Z] [a-z] > new_file
        删除指定字符
        # cat file | tr -d "Snail" > new_file
        
        cut:根据制定的分隔符切片,并显示出需要显示的片
            -d字符:指定分隔符
            -f数字:指定要显示的字段
                单个数字:一个字段
                多个离散字段:逗号分隔
                多个连续字段:- 分隔
                
        sort:按字符进行比较
        格式 sort[options] FILE
            -f:忽略大小写
            -n:对数字进行排序
            -t:指定分隔符
            -k数字:指定分隔后进行比较字段
            -u:重复的行,只显示一行
            
        uniq:移除重复的行
            -c:统计每一行出现的次数(靠着的行)
            -d:仅显示出现最少两次的行
            -u:仅显示不重复的行

      

Bash的特性之十:输入输出重定向和管道


1、文件描述符(句柄):file descriptor ,FD
    内核用来追踪现在文件的机制
    
    INPUT:标准输入,stdin,0
    OUTPUT:标准输出,stdout,1
        标准错误输出:stderr,2
        
2、I/O重定向:

    <,<<:输入重定向
    <:输入重定向
    <<:此处创建文件,常用于在脚本中创建文件或生成菜单
        << EOF EOF 此处生成文件
        
    >,>>:输出重定向
        >:覆盖输出,
        >>:追加输出
        set -C:禁止覆盖重定向至已经存在的文件
        set +C:关闭上述特性:
        >|:在-C 特性下,强制使用覆盖重定向
    
    /dev/null:bit bucket 位桶
    
    错误重定向:2>,2>>,会输出正确信息
        2>:错误重定向覆盖模式
        2>>:错误重定向追加模式
    
    同时重定标准输出和错误输出:
        命令 > /path/to/outfile 2>/path/to/errfile
        命令 &> /path/to/somefile
        命令 > /path/to/somefile 2>&1
3、管道:

    command1 | commadn2 | command3
    
    分叉输出:tee,命令不会处理,会送到下一个管道
        例子: ls /etc/*.file | tee /tmp/newfile | wc -l

Bash特性之十一:算术运算及正则表达式        

1、bash中的算术运算:
    declare
      -i:整型变量
      -x: 环境变量,类似于export
     let:
       let varName=算术表达式
       varName=$[算术表达式]
       varName=$((算术表达式))
       varName=`expr 变量1 + 变量2 `
       除法运算有余数被省略(圆整)
      操作符:+,—,*,/,%(余数)
      let totalWeight+=2
      totalWeight=      $[$totalWeight+2]
      上面两个相同
       +=,-=,*=,/=,%=
       id++,id--,每次都+1
       
    bash的单步执行:
        bash -x /path/to/script


2、文本处理工具之grep、egrep和fgrep
    grep:(global search regular expression(RE)and print out the line)        
        文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,并显示匹配的行
    格式:grep [options] 'PATTERF' file,默认只支持基本正则表达式,要匹配额外功能的字符用-E
        选项:
          --color 指定颜色
          -v:反向匹配,显示不能被模式匹配到的行
          -o:仅匹配被模式匹配到的字串,而非整行
          -i:不区分大小写,ignore-case
          -E:支持扩展
          -A #:还显示模式下面的一行
          -B #:还显示模式上面的一行
          -C #:前后各显示一行


3、正则表达式:是一类字符所书写出的模式(pattern)
    分类:
        基本正则表达式和扩展正则表达式
    基本正则表达式的元字符:
        .:任意单个字符
        []:指定范围内的任意单个字符
        [0-9],[[:digit:]]
        [a-z],[[:lower:]]
        [A-Z],[[:upper:]]
        所有的字母:[[:alpha:]]
        字母+数字:[[:alnum:]]
        空格:[[:space:]]
        标点符号:[[:putct:]]
        [^]: 指定范围外的任意单个字符
        
    次数匹配:用来指定匹配其前面的字符的次数
        *:任意次
       例子:x*y xxy xy y 都能匹配
       
        .*:匹配任意长度的任意字符
        \?:前面字符出现0次或者1次的
        \{m\}:匹配m次
        \{m,n\}:至少m次,至多n次
        \{m,\}:至少m次
        \{0,n}:至多n次
    
            shell中默认使用的是贪婪模式,即尽可能的长的去匹配字符:

    位置锚定:用于指定字符出现的位置
        ^:锚定行首
            ^Char
        $:锚定行尾
            grepchar$
        ^$:空白行
        
    单词的位置锚定
        \<char :锚定词首,\b
        char\> : 锚定词尾,char\b
        
    分组:(括号在shell中有特殊含义,故而需\)
    \(\)
        例子:\(ab\)*xy
     引用:
         \1:后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式匹配到的内容,意思是说前面出现一次,在\1这也要出现一次

    grep egrep fgrep
4、egrep:使用扩展正则表达式来构建模式,相当于 grep -E

    字符匹配:
        .:任意单个字符
        []:指定范围内的任意单个字符
        [^]:指定范围外的任意单个字符
    次数匹配
        *:匹配器前面的字符任意次
        ?:匹配器前面的字符0或1次
        +:匹配其前面字符至少一次
        {m}:匹配其前面字符m次
        {m,n}:至少m次,至多n次
        {m,}:至少m次
        {0,n}:只读n次
    分组:
        ():分组
        |:或者,ac|bc ac或者bc

5、fgrep:fast,不解析正则表达式


Bash特性之十二:条件判断

1、条件判断的常用判断类型:
    整数测试:
         二元测试:
         num1 操作符 num2
         -eq 等于
         -ne 不等于
         -le:小于等于
         -ge:大于等于
         -lt:小于
         -gt:大于
        
    字符测试:字符测试,一般加双引号
        双目:
            > : 大于
            < :小于
            ==:等于,等值比较
            =~:左侧是字符串,右侧是一个模式,判断左侧的字符串能否被右侧的模式所匹配:通常只在[[]]中使用
                模式中可以使用行首、行尾锚定符,但是模式不要加引号
            !=, <>: 不等于
        单目:
             -n 字符串: 字符串是否不空,不空为真,空则为假
             -z 字符串:字符串是否为空,空则为真,不空则假:
        
    文件测试:
        单目测试:
            -e file :测试文件是否存在
            -a file :测试文件是否存在
            -f file: 测试是否为普通文件
            -d 目录: 测试是否为目录文件
            -b somefile : 测试文件是否存在并且是否为一个块设备文件
            -c somefile : 测试文件是否存在并且是否为一个字符设备文件
            -h|-L somefile : 测试文件是否存在并且是否为符号链接文件
            -p somefile : 测试文件是否存在并且是否为管道文件:
            -S somefile : 测试文件是否存在并且是否为套接字文件:
            -r somefile:  测试其有效用户是否对此文件有读取权限
            -w somefile:  测试其有效用户是否对此文件有写权限
            -x somefile:  测试其有效用户是否对此文件有执行权限
            -s somefile:  测试文件是否存在并且不空
        双目测试:
            file1 -nt file2 :测试file1是否比file2更 新一些
            file1 -ot file2 :测试file1是否比file2更 老一些


2、bash中如何做测试:
        1、test 表达式
        
        2、[ 测试表达式 ]
            注意:在[] 表达式中,常见的>,<需要加转义字符,表示字符串大小比较,以acill码 位置作为比较。
            不直接支持<>运算符,还有逻辑运算符|| && 它需要用-a[and] –o[or]表示

        3、[[ 测试表达式 ]]  推荐使用此种
            注意:[[]] 运算符只是[]运算符的扩充。能够支持<,>符号运算不需要转义符,它还是以字符串比较大小。
            里面支持逻辑运算符:|| &&
3、bash中条件判断使用if:
    单分支:
        if [[条件]]; then
          分支1;
        fi
        
    双分支:
        if [[条件]]; then
            分支1;
        else
            分支2;
        fi
        
    多分支:
        if [[条件]]; then
            分支1;
        elif 条件2; then
            分支2;
        elif 条件3; then
            分支3;
        ...
        else
            分支n;
        fi

    注意:使用命令用作条件,就表示引用的是其状态结果(即执行成功与否),而非命令的输出结果,记得重定向结果到/dev/null  
        bash知识点之脚本自动退出
            exit n n不能为0,1,127,255的数字,这几个数字被系统默认使用,故而只能自定义其他数字。
        在脚本中使用source命令倒入别的文件
            [ -r 配置文件 ] && source 配置文件

Bash特性之十三:while、until循环,case语句
1、while循环:
    while 条件测试:do
        循环体
     done
    
    while循环:条件测试成功,则循环;失败,则退出

2、until循环:
    until 测试条件;do
        循环体
    done
 
    until循环:条件不满足,则循环;否则,退出


3、循环控制:
   continue:提前结束本次循环而开始评估下一轮
   break[n]:跳出当前循环


4、case语句语法格式:
    case 表达式 in
    模式1)
        条件1
        ;;
    模式2)
        条件2
        ;;
    模式n)
        条件n
        ;;
    *)
        剩余条件
        ;;
    esac

case中各模式可以使用模式:
    a|b:a或者b
    *:匹配任意长度的任意字符
    ?:匹配任意单个字符
    [-]:范围匹配

Bash特性之十四:函数
    1、函数是能够实现模块化编程的工具,模块化编程,最大化的代码重用,最小化的代码冗余
    函数定义:
   
    FuncName(){
        函数体
    }
    或
    function FuncName{
        函数体
    }


    2、函数有两种返回值:
        1、正常返回的数值:
            函数中的打印语句,如echo N
           
        2、执行状态的返回值:
            自定义: return N
            不同的是需要使用 echo $?获得返回值
    3、函数可以接受参数:

        在函数体可以使用类似脚本调用位置参数一样的参数
        $0     当前脚本的文件名
        $n     传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
        $#     传递给脚本或函数的参数个数。
        $*     传递给脚本或函数的所有参数。
        $@     传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同。
        $?     上个命令的退出状态,或函数的返回值。
        $$     当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
    4、变量作用域
        1、函数会用两种类型的变量:
            A 全局变量
                默认情况下,你在脚本中定义的任何变量都是全局变量,在函数外定义的变量可在函数内正常访问
            B 局部变量
                不用在函数中使用全局变量,函数内部使用的任何变量都可以被声明成局部变量。要那么做时,
                只要在变量声明的前面加上local关键字就可以了,也可以在给变量赋值时在赋值语句中使用local关键字,
                local关键字保证了变量只局限在该函数中,如果脚本中在该函数之外有同样的名字的变量,
                那么shell将会保证这两个变量的值是分离的。
        2、查找次序:
            内层函数自己
            外层函数
            主程序的
            bash内置的环境变量
                
    5、可以使用source + 路径的方式导入其他的库文件中的函数。


bash编程之十五:数组初步与信号捕获

1、数组:数据结构,数据序列,保存了连续的多个数据,可以使用索引获取相关元素

    声明数组:declare -a arryname

    初始化或赋值:各元素间使用空白字符分隔,不加下标默认为第一个
    arrayname=('a' 'b' 'c')
    第二种:可以自定义下标
    [下标]='字符'
    第三种:arrayname[0]='a';arrayname[1]='b';
    显示第一个字符
    echo ${arrayname(0)}

    获取元素的长度
    ${#arrayname[下标]}
    查看有效元素的个数
    ${#arrayname[@|*]}

    bash的伪随机生成器
        $RANDOM

   取特定位数的
    $[$RANDOM%7]
练习:从所有同学中选择任意位
    arry2=0
    read -p "Enter a num : " num
    arry1=$[$RANDOM%39]
    echo ${nnt[$arry1]}
    for i in `seq 1 $num`;do
        let arry2=$arry1+$i
        echo ${nnt[$arry2%39]}
    done

2、bash编程的信号捕获
    trap 陷阱
    trap ‘command’ signal
    kill -l
    KILL无法捕捉

  信号捕捉用于:在中途中止时做一些清理操作
 









推荐阅读