概述

常见的shell介绍
sh/bash/zsh/dash

1 Shell简介

概念

shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

  1. 命令(与操作系统实时交互,工具软件,C语言实现的程序)
  2. 语言(进行程序设计,Linux各种软件本身是一个应用程序,也可以看做shell语言中的一个包!!!)

Shell的分类

  • 主要介绍bash,其他shell基本兼容bash提供的语法。
1
2
3
4
5
6
7
8
9
10
11
12
➜  notes git:(master) ✗ cat /etc/shells 
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

常用快捷键

快捷键 作用
ctrl+A 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。
ctrl+E 把光标移动到命令行结尾。
ctrl+C 强制终止当前的命令。
ctrl+L 清屏,相当于clear命令。
ctrl+U 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便
ctrl+K 删除或剪切光标之后的内容。
ctrl+Y 粘贴ctrl+U或ctul+K剪切的内容。
ctrl+R 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。
ctrl+D 退出当前终端。
ctrl+Z 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍。
ctrl+S 暂停屏幕输出。
ctrl+Q 恢复屏幕输出。

2 输入输出重定向

标准输入输出

设备 设备名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出

输入重定向

输入重定向:是指不使用系统提供的标准输入端口,而进行重新的指定。换言之,输入重定向就是不使用标准输入端口输入文件,而是使用指定的文件作为标准输入设备。(重定向简单理解就是使用 “<”符来修改标准输入设备)

类型 符号(语法) 功能
标准输入 命令<文件1 命令把文件1的内容作为标准输入设备
标识符限定输入 命令<<标识符 命令把标准输入中读入内容,直到遇到“标识符”分解符为止
输入输出重定向(同时使用) 命令< 文件1 >文件2 命令把文件1的内容作为标准输入,把文件2作为标准输出。

输出重定向

输出重定向:(通俗的讲,重定向输出就是把要输出的文件信息写入到一个文件中去,而不是将要输出的文件信息输出到控制台(显示屏),在linux中,默认的标准输出设备是控制台(或称为显示器),用户输出的信息默认情况下都会显示到控制台

类型 符号 作用
标住输出重定向 命令 > 文件 以覆盖方式,把命令的正确输出内容输出到指定的文件或设备当中
标住输出重定向 命令 >> 文件 以追加方式,把命令的正确输出内容输出到指定的文件或设备当中
标准错误输出重定向 错误命令2 > 文件 以覆盖方式,把命令的错误输出输出到指定的文件或设备当中
标准错误输出重定向 错误命令2 >> 文件 以追加方式,把命令的错误输出输出到指定的文件或设备当中
正确输出和错误输出同时保存 命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
正确输出和错误输出同时保存 命令 >> 文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。
正确输出和错误输出同时保存 命令 &> 文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
正确输出和错误输出同时保存 命令 &>> 文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。
正确输出和错误输出同时保存 命令 >> 文件1 2>>文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中。

/dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃,俗称“黑洞”

3 命令执行

多命令执行

  • ; 命令1 ;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
  • && 命令1 && 命令2 当命令1正确执行 , 则命 令 2 才 会 执 行当命令1执行不正确,则命令2才会执行 当命令1执行不正确(?=0),则命令2才会执行当命令1执行不正确(?≠0),则命令2不会执行
  • || 命令1 || 命令2 当命令1执行不正确 , 则 命 令 2 才 会 执 行 当 命 令 1 正 确 执 行,则命令2才会执行当命令1正确执行,则命令2才会执行当命令1正确执行,则命令2不会执行

Shell脚本执行

编辑shell脚本

1
2
3
[root@localhost ~]$ vim test.sh
#!/bin/bash
echo “hello world”

两种方式执行shell脚本

  • 第一种方式:给文件添加执行权限,直接执行
1
2
[root@localhost ~]$ chmod u+x test.sh
[root@localhost ~]$ ./test.sh #绝对路径或相对路径执行
  • 第二种方式:通过bash命令
1
[root@localhost ~]$ bash test.sh

4 Shell中的字符串

可以从编译原理的角度解析shell中的元素

Shell只包含一种数据结构

  • Shell中的一切都是字符串。
    • 可以是单个字符串
    • 可以是单引号’字符串’
    • 可以是双引号”字符串”
  • 空格回车可以将字符串分割成多个不同的token字符串
  • 特殊字符可以将字符串分割成多个不同的token字符串

在bash中字符串只有三种作用变量/值/命令

  • 变量字符串
    • 包含=的字符串,左边是变量名,右边是值,也是字符串
    • 使用$标识的字符串,能够引用变量的值
  • 值字符串
    • 值是一个普通字符串
  • 命令字符串
    • 使用空格作为分隔符的字符串。第一个字符串是命令,后边的字符串是值字符串。

字符串中包含特殊意义的符号

  • 单引号、双引号
  • 与变量和命令相关的特殊字符= $ ${} 反引号 $()
  • 与命令相关的特殊字符() [] {}
  • 注释#

字符串中特殊的关键字

  • if,for,while,case,then