bash的基础特性

bash的基础特性

  • 引用
  • 多命令执行:
  • 命令补全:$PATH
  • 路径补全:TAB
  • 命令行展开:~ {}
  • 命令的执行状态结果
  • 命令hash缓存表
  • 命令别名:alias, unalias
  • 命令历史:history
  • 文件名通配符:glob
  • 变量
  • bash快捷键

引用

强引用:单引号,变量引用不执行替换;
~]# echo '$SHELL'
弱引用:双引号,变量引用会被替换;
~]# echo "$SHELL"
命令引用:反向单引号,会将引号内的字符当做命令或变量执行
~]# echo `$SHELL`

命令行展开:~, {}

~:自动展开为用户的家目录,或指定的用户的家目录;  
    例如:cd ~
{}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
    例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b

多命令执行

~]# 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

命令补全:$PATH

shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令;
    命令查找机制:
        查找内部命令;
        根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;

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

路径补全:TAB

在给定的起始路径下,以对应路径下的打头字串来逐一匹配起始路径下的每个文件:
    tab:
        如果能惟一标识,则直接补全;
        否则,再一次tab,给出列表;

命令的执行状态结果

bash通过状态返回值来输出此结果:$?
    成功:0
    失败:1-255

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

命令正常执行时,有的还回有命令返回值:
根据命令及其功能不同,结果各不相同;
引用命令的执行结果:
    $(COMMAND)  或  `COMMAND`

命令hash缓存表

系统初始hash表为空,当外部命令执行时,默认会从PATH 路径下寻找该命令,
找到后会将这 条命令的 路径记录到hash表中,当再次使用该命令时,
shell 解释器首先会查看hash表,存在将执行之,
如果不存在,将会去PATH 路径下寻找。
利用hash 缓存表可大大提高命令的调用速度

hash 常见用法

hash 显示 hash 缓存
hash –l 显示 hash 缓存,可作为输入使用
hash –p path name 将命令全路径path起别名为name
hash –t name 打印缓存中name 的路径
hash –d name 清除name 缓存
hash –r 清除缓存

命令别名:alias, unalias

alias name=‘value#定义命令别名
例如: alias cdnet='cd /etc/sysconfig/network-scripts'

获取当前shell进程的所有可用别名:
    ~]# alias
定义别名:
    ~]# alias cdnet='cd /etc/sysconfig/network-scripts'
    注意:仅对当前shell进程有效
撤销别名:
    ~]# unalias NAME

如果别名和原命令同名,想执行原命令,可以使用:
    \command
    'command'

在命令行定义的别名,仅在当前shell进程有效
如果想永久有效,需要定义在配置文件中
仅对当前用户有效: ~/.bashrc
对所有用户有效: /etc/bashrc

编辑配置给出的新配置不会立即生效
需要bash 进程重新读取配置文件
source /path/to/config_file
. /path/to/config_file

命令历史:history

显示shell进程会其会话中保存此前用户提交执行过的命令

    -c: 清空命令历史;
    -d offset:删除指定命令历史
    -r: 从文件读取命令历史至历史列表中;
    -w:把历史列表中的命令追加至历史文件中;
history #:显示最近的#条命令;

调用命令历史列表中的命令:
    !#:再一次执行历史列表中的第#条命令;
    !!:再一次执行上一条命令;
    !STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;

定制history的功能,可通过环境变量实现:
    HISTSIZE :命令历史记录的条数
    HISTFILE :指定历史文件,默认为~/.bash_history
    HISTFILESIZE :命令历史文件记录历史的条数
    HISTTIMEFORMAT=“%F %T “ 显示时间
    HISTIGNORE=“str1:str2*:… “ 忽略str1 命令,str2 开头的历史
    .bash_history:命令记录保存文件

控制命令历史记录的方式:
    环境变量:HISTCONTROL
        ignoredups:忽略重复的命令;
        ignorespace:忽略以空白字符开头的命令;
        ignoreboth:以上两者同时生效;
        erasedups:删除 重复命令
    例如:export HISTCONTROL="ignoreboth"

环境变量存放在 /etc/profile 或 ~/.bash_profile

调用上一条命令的最后一个参数:
    快捷键:ESC, .
    字符串:!$
利用上一个命令的第n个参数做命令:
    字符串:!:n : 

文件名通配符:glob

用来快速查找文件或目录

匹配模式:元字符
    *:匹配任意长度的任意字符
        pa*, *pa*, *pa, *p*a*
            pa, paa, passwd
    ?:匹配任意单个字符
        pa?, ??pa, p?a, p?a?
            pa, paa, passwd
    []:匹配指定范围内的任意单个字符
        有几种特殊格式:
            [a-z], [A-Z], [0-9], [a-z0-9]
            [[:upper:]]:所有大写字母
            [[:lower:]]:所有小写字母
            [[:alpha:]]:所有字母
            [[:digit:]]:所有数字
            [[:alnum:]]:所有的字母和数字
            [[:space:]]:所有空白字符
            [[:punct:]]:所有标点符号

            pa[0-9][0-9], 2[0-9][0-9]
    [^]:匹配指定范围外的任意单个字符
        [^[:upper:]]
        [^0-9]
        [^[:alnum:]]

变量

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

程序:算法+数据结构
    算法:设计解决问题的路径
变量:指向的内存空间的别名

变量赋值:name=value
变量类型:存储格式、表示数据范围、参与的运算
    编程语言:
        强类型变量:
            变量的类型的固定的 
        弱类型变量:
            bash把所有变量统统视作字符型;不支持浮点类型,除非借助工具
            bash中的变量无需事先声明;相当于,把声明和赋值过程同时实现;
                声明:类型,变量名
变量替换:把变量名出现的位置替换为其所指向的内存空间中数据;变量引用
变量引用:${var_name}, $var_name  
变量名:变量名只能包含数字、字母和下划线,而且不能以数字开头;
    变量名:见名知义,命名机制遵循某种法则;不能够使用程序的保留字,例如if, else, then, while等等;

bash变量类型:
    本地变量:作用域仅为当前shell进程;
    环境变量:作用域为当前shell进程及其子进程;
    局部变量:作用域仅为某代码片断(函数上下文);

位置参数变量:当执行脚本的shell进程传递的参数;
特殊变量:shell内置的有特殊功用的变量;
    $?:查看命令的执行状态结果
        0:成功
        1-255:失败

本地变量:作用域仅为当前shell进程;
    变量赋值:name=value
    变量引用:${name}, $name
        "":变量名会替换为其值;
        '':变量名不会替换为其值;
    查看变量:set
    撤销变量:unset name
        注意:此处非变量引用;

环境变量:作用域为当前shell进程及其子进程;
    变量赋值:
        (1) export name=value   导出一个变量,子shell可用
        (2) name=value
            export name
        (3) declare -x name=value  可导出,可指定变量类型
        (4) name=value
            declare -x name
    变量引用:${name}, $name
        例如:animal=tigger
              echo "There are some ${animal}s"

    注意: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快捷键:

Ctrl + l 清屏,相当于clear 命令
Ctrl + o 执行当前命令,并重新显示本命令
Ctrl + s 阻止屏幕输出,锁定
Ctrl + q 允许屏幕输出
Ctrl + c 终止命令
Ctrl + z 挂起命令
Ctrl + a 光标移到命令行首,相当于Home
Ctrl + e 光标移到命令行尾,相当于End
Ctrl + f 光标向右移动一个字符
Ctrl + b 光标向左移动一个字符
Alt + f 光标向右移动一个单词尾
Alt + b 光标向左移动一个单词首
Ctrl + xx 光标在命令行首和光标之间移动
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Alt + r 删除当前整行

猜你喜欢

转载自blog.csdn.net/lv8549510/article/details/80244862