iMisty的技术栈

iMisty的技术栈

Shell基础

998
2019-08-06

shell基础

shell是什么

  • shell就是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动,挂起,停止甚至是编写一些程序

  • shell还是一个功能相当强大的编程语言,易编写,易调试灵活性较强,shell是解释执行的脚本语言,在shell中可以直接调用linux命令

  • shell主要用来简化管理员操作,方便系统管理的,注重功能实现和清晰的逻辑,非服务器程序那样注重效率

shell将命令通过ASSIC码表翻译为计算机可以识别的指令给内核,内核执行返回执行结果给shell

###shell的分类

echo $SHELL 查看当前的系统中运行的shell

  • Bourne Shell : 从1979 起Unix就开始使用bourne shell ,主文件名为sh

    不支持历史命令

  • C shell : C shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而闻名

  • shell的主要语法类型有bourne 和C这两种语法彼此不兼容,bourne 家族主要包括sh,ksh,bash,psh,zsh,C家族主要包括csh,tcsh

    一般linux系统中的shell是bash,这个不分发行版本,

  • bash:bash和sh 兼容,现在使用linux就是使用bash作为用户的基本shell

    在控制台键入 sh进入sh,是一种比较古老比较简单的模式,占用的资源更少,在进行系统修复的时候使用

  • linux可以在终端调用另一个shell或者子shell,可以做到层级调用

脚本的执行方法

  1. echo [选项] [输出内容] ,当输出内容有空格就需要双引号

    • 选项 -e 支持反斜线控制的字符转换 ,用来调整字符格式

    • 十六进制输出 , echo -e "\x68\t\x65\t"

  2. 字符转换

  3. 输出字体颜色, \e[1;31m 开启颜色显示,\e[0m 关闭颜色显示
    echo -e " \e[1;31m hello linux \e[0m "

    !在echo中是有特殊含义的不能直接输出;真实的环境是不可以输入中文的,但是xshell之类的远程连接工具可以,除非安装中文环境;

脚本编写与执行

    //vim 编写脚本
    vim hello.sh;

    //这不是注释,而是必须要带的规范,如果是纯shell语言没有问题,但是在shell语言中可以调用其他语言,不写规范脚本执行会报错
    #!/bin/bash
    #the first program
    echo -e " \e[1;31m hello linux \e[0m " 
    // :wq保存退出

    //脚本执行 , 赋予执行权限,直接运行
    chmod 755 hello.sh
    //通过bash调用脚本执行(bash直接解释脚本) 或者 ./hello.sh
    bash hello.sh

别名与快捷键

linux 别名

  • alias 查看系统当中已经用到了的别名

    • alias 别名 = [原命令] 设定命名别名
    • 实例 alias ls = 'ls --color==never'取消ls命令的颜色显示
    • alias ls = 'ls --color==auto' 开启ls命令的颜色显示

    vim 是vi 的增强版, 支持颜色显示,功能更加强大,可以设置别名,alias vi=vim

  • 以上方法配置别名之后只能临时生效,重启计算机别名配置就失效了

    *   `vi ~/.bashrc` 写入环境变量配置文件,每一个用户都会有环境变量配置文件,会对对应的用户生效
    
`alias vi='vim' //临时生效
  vi /root/.bash.rc 写入 alias vi='vim'
  `source .bashrc`  //直接生效
> 在环境变量配置之后,需要重新登陆才能生效,`source .bashrc` 直接生效不用重新登录
  • unalias 别名 删除别名 ,只是临时删除,如果需要永久删除,不仅要执行这一句话,并且还要在环境变量配置文件删除,并且生效

    命令生效顺序

  1. 顺位执行用绝对路径或相对路径执行的命令

  2. 顺位执行别名

  3. 顺位执行bash内部命令

  4. 顺位执行按照$PATH环境变量定义的目录查找顺序找到第一个命令

    以上所有的方式都没有找到命令,name终端显示命令没有找到

    快捷键

  • Ctrl +c 强制终止

  • clear 命令清屏 ,快捷Ctrl +L

  • Ctrl + u 从光标所在位置删除到首行

  • Ctrl + a 光标移动到命令行首

  • Ctrl + e 光标移动到命令行尾

  • ctrl + z 把命令放入后台

  • ctrl + r 在历史命令中搜索

    历史命令

  • history [选项] [历史命令保存文件]

    *   选项 `-c` 清空历史命令
    
    • -w把缓存中的历史命令写入历史命令保存文件 ~/.bash_history ,每个用户都有自己的历史命令保存文件,不同用户不会互相冲突

    history中的命令和历史命令文件保存的不一定一致,一般而言要多一些,系统会在正常退出之后将缓存中的命令写入到文件中,history -w将缓存写入文件

  • 历史命令默认保存1000条,可以在环境变量配置文件中/etc/profile 中修改

    历史命令的调用

  • 使用上下箭头调用以前的历史命令

  • 使用 !n重复执行第n条历史命令

  • 使用!!重复执行上一条命令

  • 使用 !字符串 重复执行最后一条以该字符串开头的命令

    命令与文件补全

  • 使用 TAB 键操作来补全命令和文件,补全命令依赖 $PATH环境变量,补全文件依赖当前操作的路径

    输入与输出重定向

  • 输入与输出: 将内容写入系统为输入,将执行完的结果进行显示为输出

  • 标准的输入输出,用文件描述符来表示键盘(标准输入)显示器(包括正确与错误输出)

    输出重定向,将显示在控制台的结果输出到文件中(前提是有输出结果),如果文件不存在则创建,存在则修改文件

    正确输出 命令 > 文件 错误输出 错误命令 2>文件 ,错误输出记得不要带上空格

输入重定向

  • wc [选项] [文件名]

    • 选项 -c 统计字节数
    • -w 统计单词数
    • -l 统计行数

命令<文件把文件作为命令的输入

  • wc log.txt 等于 wc < log.txt

命令<<标识符

  • 用于统计下次输入到标识符之间的输入的内容

  • 标识符把标识符之间内容作为命令的输入

    多命令顺序执行

    • ls && echo yes || echo no 注意逻辑与和逻辑或不能随意调换顺序 ,当第一条命令正确执行,逻辑与生效,第二条命令才会执行,然后逻辑或生效,第三条命令也就不会执行

    管道符

  • 命令格式 命令1 | 命令2 命令1的正确输出作为命令2的操作对象;

  • 管道符操作的命令比较严格,不是任何命令都可以对结果进行操作

    ls -l | echo //无法正确输出
    ls -l | more 分屏显示输出结果
    netstat -an |grep "ESTABLISHED"
    

   ###### 管道符和逻辑或逻辑与的区别

*   管道符的操作的是上一条命令的执行结果,而逻辑操作没有数据交换,只是命令的执行结果影响执行逻辑

   > more命令分屏显示文件内容,可以先将命令操作结果输出重定向到文件,然后more  查看文件;
>       abc[^0-9]* 匹配以abc开头的非数字字符串

   ### linux 通配符

   ![](https://gitee.com/iMist/Linux/raw/master/images/image27.png)

*   Bash中的其他特殊符号
   ![](https://gitee.com/iMist/Linux/raw/master/images/imsgr28.png)
*   echo `ls` 等同于 echo $(date) 反引号的功能和 `$()`一致 ,调用系统命令,先执行再赋值给系统变量

  `bb=$(ls)`将结果赋值给变量
   `echo $bb` //打印变量结果