• 认识与学习bash


    什么是shell

    在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器),它接收用户命令,然后调用相应的应用程序。用户可以透过应用程序来指挥核心, 让核心达成我们所需要的硬件任务!
    在这里插入图片描述

    shell 与 /etc/shell

    shell 依据发展者的不同有许多的版本,例如常听到的 Bourne SHell (sh) 、在 Sun 里头默认的 C SHell、 商业上常用的 K SHell、, 还有 TCSH 等等,每一种 Shell 都各有其特点。至于 Linux 使用的这一种版本就称为『 Bourne Again SHell (简称 bash) 』,这个 Shell 是 Bourne Shell 的增强版本.
    检查一下 /etc/shells 这个文件,可以查看当前服务器可以使用的 shell,以下罗列常见的shells:

    • /bin/sh (已经被 /bin/bash 所取代)
    • /bin/bash (就是 Linux 默认的 shell)
    • /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash)
    • /bin/tcsh (整合 C Shell ,提供更多的功能)
    • /bin/csh (已经被 /bin/tcsh 所取代)
    • /bin/zsh (基于 ksh 发展出来的,功能更强大的 shell)
      在这里插入图片描述

    为什么要将shell写入/etc/shells文件里面?这是因为系统某些服务在运行过程中,会去检查使用者能够使用的 shells ,而这些 shell 的查询就是藉由 /etc/shells 这个文件。
    那么,再想一想,我这个使用者什么时候可以取得 shell 来工作呢?还有, 我这个使用者默认会取得哪一个 shell? 当我登陆的时候,系统就会给我一个 shell 让我来工作了。 而这个登陆取得的 shell 就记录在 /etc/passwd 这个文件内。
    在这里插入图片描述

    如上所示,在每一行的最后一个数据,就是你登陆后可以取得的默认的 shell

    shell 的功能

    bash 主要的优点有底下几个:

    • 历史命令 (history)
    • 命令与文件补全功能(tab 按键)
    • 命令别名配置功能(alias)
    • 工作控制、前景背景控制 (job control, foreground, background)
    • 程序化脚本 (shell scripts)
    • 通配符 (Wildcard)
    • 内建命令 type

    历史命令

    在命令行里面按上下键就可以查找到前后输入的命令,命令储存在家目录的.bash_history文件里面,.bash_history里面存放的是上一次登录以前执行的命令,当前登录的命令缓存在内存中,只有注销系统后才会记录到~/.bash_history。

    history [-raw] histfiles
    选项与参数:
    n   :数字,意思是『要列出最近的 n 笔命令行表』的意思!
    -c  :将目前的 shell 中的所有 history 内容全部消除
    -a  :将目前新增的 history 命令新增入 histfiles 中,若没有加 histfiles ,
          则默认写入 ~/.bash_history
    -r  :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;
    -w  :将目前的 history 记忆内容写入 histfiles 中!
    立刻将目前的数据写入 histfile 当中
    history -w # 在默认的情况下,会将历史纪录写入 ~/.bash_history 当中!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    命令与文件补全

    • [Tab] 接在一串命令的第一个字的后面,则为命令补全;
    • [Tab] 接在一串命令的第二个字以后时,则为『文件补齐』

    命令别名配置功能

    一长串命令需要输入许多单词,可以使用别名alias 简化命令操作。

    alias lm='ls -la | more'
    
    • 1

    使用alias命令可以查看当前有哪些命令别名
    在这里插入图片描述

    type命令

    type [-tpa] name
    选项与参数:
        :不加任何选项与参数时,type 会显示出 name 是外部命令还是 bash 内建命令
    -t  :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
          file    :表示为外部命令;
          alias   :表示该命令为命令别名所配置的名称;
          builtin :表示该命令为 bash 内建的命令功能;
    -p  :如果后面接的 name 为外部命令时,才会显示完整文件名;
    -a  :会由 PATH 变量定义的路径中,将所有含 name 的命令都列出来,包含 alias
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    bash默认组合键

    组合按键执行结果
    Ctrl + C终止目前的命令
    Ctrl + D输入结束(EOF),例如右键结束的时候
    Ctrl + M回车
    Ctrl + S暂停屏幕的输出
    Ctrl + Q恢复屏幕的输出
    Ctrl + U在提示字符下,将整列命令删除
    Ctrl + Z暂停目前的命令

    通配符与特殊符号

    符 号意义
    *代表『 0 个到无穷多个』任意字符
    ?代表『一定有一个』任意字符
    [ ]同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
    [ - ]若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
    [^ ]若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。
    范例一:找出 /etc/ 底下以 cron 为开头的档名
    [root@www ~]# ll -d /etc/cron*    <==加上 -d 是为了仅显示目录而已
    
    范例二:找出 /etc/ 底下文件名『刚好是五个字母』的文件名
    [root@www ~]# ll -d /etc/?????    <==由于 ? 一定有一个,所以五个 ? 就对了
    
    范例三:找出 /etc/ 底下文件名含有数字的文件名
    [root@www ~]# ll -d /etc/*[0-9]*  <==记得中括号左右两边均需 *
    
    范例四:找出 /etc/ 底下,档名开头非为小写字母的文件名:
    [root@www ~]# ll -d /etc/[^a-z]*  <==注意中括号左边没有 *
    
    范例五:将范例四找到的文件复制到 /tmp 中
    [root@www ~]# cp -a /etc/[^a-z]* /tmp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    bash 环境中的特殊符号

    符号内容
    #批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行
    \跳脱符号:将『特殊字符或通配符』还原成一般字符
    |管线 (pipe):分隔两个管线命令的界定(后两节介绍);
    ;连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
    ~用户的家目录
    $取用变量前导符:亦即是变量之前需要加的变量取代值
    &工作控制 (job control):将命令变成背景下工作
    !逻辑运算意义上的『非』 not 的意思!
    /目录符号:路径分隔的符号
    >, >>数据流重导向:输出导向,分别是『取代』与『累加』
    <, <<数据流重导向:输入导向 (这两个留待下节介绍)
    ’ ’单引号,不具有变量置换的功能
    " "具有变量置换的功能!
    两个『 ` 』中间为可以先运行的命令,亦可使用 $( )
    ( )在中间为子 shell 的起始与结束
    { }在中间为命令区块的组合!
  • 相关阅读:
    技术面经总结
    Python接口测试封装request的发送,json的处理,提取,修改
    Mysql-数据丢失,分析binlog日志文件
    Netty编码器和解码器
    web需求记录
    ChatGPT新增超强插件:文本直接生成视频、海报,支持自定义修改!
    C++使用pybind11编译动态库出错
    [附源码]SSM计算机毕业设计网上零食商城JAVA
    PostgreSql学习(基于菜鸟课程)
    【代码随想录刷题记录】LeetCode34在排序数组中查找元素的第一个和最后一个位置
  • 原文地址:https://blog.csdn.net/qq_32702685/article/details/127627294