# Shell 基础

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

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

# Shell 的分类

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

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

  • Shell 两种主要语法类型有 Bourne 和 C,这两种语法彼此不兼容。Bourne 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括:csh、tcsh

  • Bash:Bash 与 sh 兼容,现在使用的 Linux 就是使用 Bash 作为用户的基本 Shell

# Shell 脚本的执行方式

# echo 输出命令

语法: echo [选项] [输出内容]

选项:

​ -e: 支持反斜线控制的字符转换

image-20220709102746600

# 脚本执行

  • 赋予执行权限,直接运行
    • chmod 755 hello.sh
    • ./hello.sh
  • 通过 Bash 调用执行脚本
    • bash hello.sh

注意:Linux 和 Windows 中的回车符表示不一样,在 Linux 当中回车符为 $ ,而在 Windows 当中回车符为 ^M$ ,如果想在 Linux 当中执行 Windows 下编辑的 shell 脚本,可以以使用 dos2unix 命令将指定脚本转换成 Linux 格式再运行。

# Bash 的基本功能

# 历史命令与命令补全

历史命令

语法: history [选项] [历史命令保存文件]

选项:

​ -c: 清空历史命令

​ -w: 把缓存中的历史命令写入历史命令保存文件~/.bash_history

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

历史命令的调用

  • 使用上、下箭头调用以前的历史命令
  • 使用 !n 重复执行第 n 条历史命令
  • 使用 !! 重复执行上一条命令
  • 使用 !字符 重复执行最后一条以该字串开头的命令

命令与文件补全

  • 在 Bash 中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按 “Tab” 键就会自动进行补全,两下 Tab 键可以查询所有以当前字符开头的命令

# 命令别名与常用快捷键

命令别名

[root@localhost ~]# alias 别名 =' 原命令'
# 设定命令别名
[root@localhost ~]# alias
# 查询命令别名

命令执行顺序

  1. 第一顺位执行用绝对路径或相对路径执行的命令。
  2. 第二顺位执行别名。
  3. 第三顺位执行 Bash 的内部命令。
  4. 第四顺位执行按照 $PATH 环境变量定义的目录查找顺序找到的第一个命令。

让别名永久生效

修改 /root/.bashrc 文件

删除别名

语法: unalias 别名

Bash 常用快捷键

image-20220712090933580

# 输入输出重定向

标准输入输出

设备设备文件名文件描述符类型
键盘/dev/stdin0标准输入
显示器/dev/stdout1标准输出
显示器/dev/stderr2标准错误输出

输出重定向

image-20220712092123437

image-20220712092405404

输入重定向

语法: wc [选项] [文件名]

功能:统计输入字符的行数、单词数和字节数

选项:

​ -c 统计字节数

​ -w 统计单词数

​ -l 统计行数

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

# 多命令顺序执行与管道符

多命令执行符

image-20220830194222008

管道符

命令格式:

[root@localhost ~]# 命令1 | 命令2

#命令 1 的正确输入作为命令 2 的操作对象

[root@localhost ~]# grep [选项] "搜索内容" 文件名

选项:

​ -i 忽略大小写

​ -n 输出行号

​ -v 反向查找

​ --color=auto 搜索出的关键字用颜色显示

# 通配符与其他特殊符号

通配符

image-20220902155054296

Bash 中其他特殊符号

image-20220902155850642

# Bash 的变量

# 什么是变量?

变量是计算机内存的单元,其中存放的值可以改变。当 Shell 脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

# 变量设置规则

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是 “2name” 则是错误的。
  • 在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
  • 变量用等号连接值,等号左右两侧不能有空格。
  • 变量的值如果由空格,需要使用单引号或双引号包括。
  • 在变量的值中,可以使用 "\" 转义符。
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含 "$ 变量名" 或用 ${变量名} 包含。
  • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或 $() 包含命令。
  • 环境变量名建议大写,便于区分。

# 变量分类

  • 用户自定义变量
  • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
  • 位置参数变量:这种变量是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
  • 预定义变量:是 Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

本地变量

变量定义:

[root@localhost ~]# name="Sakupinera"

变量叠加:

[root@localhost ~]# aa=123
[root@localhost ~]# aa="$aa"456
[root@localhost ~]# aa=${aa}789

变量调用:

[root@localhost ~]# echo $name

变量查看:

[root@localhost ~]# set

变量删除:

[root@localhost ~]# unset name

环境变量

用户自定义变量只在当前的 Shell 中生效,而环境变量会在当前 Shell 和这个 Shell 的所有子 Shell 当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的 Shell 中生效。

设置环境变量:

[root@localhost ~]# export 变量名=变量值

#申明变量

[root@localhost ~]# env

#查询变量

[root@localhost ~]# unset 变量名

#删除变量

系统常见环境变量:

  • PATH:系统查找命令的路径
[root@localhost ~]# echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# PATH="$PATH":/root/sh	#PATH 变量叠加

image-20220902170822594

位置参数变量

image-20220902171340172

预定义变量

image-20220902173408631

接受键盘输入

[root@localhost ~]# read [选项] [变量名]

选项:

​ -p "提示信息":在等待 read 输入时,输出提示信息

​ -t 秒数:read 命令会一致等待用户输入,使用次选项可以指定等待时间

​ -n 字符数:read 命令只接受指定的字符数,就会执行

​ -s:隐藏输入数据,适用于机密信息的输入

# Bash 的运算符

# 数值运算与运算符

declare 声明变量类型

[root@localhost ~]# declare [+/-] [选项] 变量名

选项:

​ -: 给变量设定类型属性

​ +: 取消变量的类型属性

​ -i: 将变量声明为整数型(integer)

​ -x: 将变量声明为环境变量

​ -p: 显式指定变量的被声明的类型

# 数值运算

方法 1:declare -i

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量 aa 和 bb 赋值
[root@localhost ~]# declare -i cc=$aa+$bb

方法 2:expr 或 let 数值运算工具

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量 aa 和变量 bb 赋值
[root@localhost ~]# dd=$(expr $aa + $bb)
#dd 的值是 aa 和 bb 的和。注意 “+” 号左右两侧必须由空格

方法 3:"$((运算式))" 或 "$[运算式]"

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(($aa+$bb))
[root@localhost ~]# gg=$[$aa+$bb]

# 运算符

image-20220902200639628

# 变量测试与内容替换

image-20220902201108520

# 环境变量配置文件

# 简介

环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如 PATH、HISTSIZE、PS1、HOSTNAME 等默认环境变量。

配置文件:

  • /etc/profile
  • /etc/profile.d/*.sh
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc

注意:/etc 目录下的配置文件对所有用户都生效

source 命令

作用:让配置文件直接生效,而不用注销或者重新登录

[root@localhost ~]# source 配置文件
[root@localhost ~]# . 配置文件

# 作用

/etc/profile 的作用:

  • USER 变量
  • LOGNAME 变量
  • MAIL 变量
  • PATH 变量
  • HOSTNAME 变量
  • HISTSIZE 变量
  • umask
  • 调用 /etc/profile.d/*.sh 文件

~/.bash_profile 的作用

  • 调用了~/.bashrc 文件
  • 在 PATH 变量后面加入了 “:$HOME/bin” 这个目录

~/.bashrc 的作用

  • 定义默认别名
  • 调用 /etc/bashrc

/etc/bashrc 的作用

  • PS1 变量
  • umask
  • PATH 变量
  • 调用 /etc/profile.d/*.sh 文件

# 其他配置文件和登录信息

注销时生效的环境变量配置文件

  • ~/.bash_logout

历史命令配置文件

  • ~/bash_history

Shell 登录信息

  • 本地终端欢迎信息:/etc/issue

image-20220902205524444

  • 远程终端欢迎信息:/etc/issue.net

    • 转义符在 /etc/issue.net 文件中不能使用
    • 是否显式此欢迎信息,由 ssh 的配置文件 /etc/ssh/sshd_config 决定,加入 "Banner/etc/issue.net" 行才能显示(记得重启 SSH 服务)
  • 登陆后欢迎信息:/etc/motd

    ​ 不管是本地登录,还是远端登录,都可以显示此安全信息。