跳到主要内容

shell 基础

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

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

Bash

Bash 与 sh 兼容,现在用的 Linux 就是使用 Bash 作为用户的基本 Shell。
你可以在终端输入 echo $SHELL 来看系统使用的是那类 shell。shell 分为两大类,一类是 Bourne shell,也叫 B shell, Bash 就属于这一类;另一类是 C shell,这一类主要被 Unix 系统所采用。

脚本执行方式

echo 命令

格式:echo [选项] [输出内容]
这个命令可以将输入的内容输出。比如:echo "hello shell"。回车后就会输出 hello shell 字符串。
它的选项可以是 -e,表示支持反斜杠控制的字符转换。

控制字符描述
\a输出警告音
\b退格键,也就是向左删除键
\n换行符
\r回车符
\t制表符,也就是 Tab
\v垂直制表符
\0nnn按照八进制 ASCII 码表输出字符,nnn 是三位八进制数
\0xhh按照十六进制 ASCII 表输出字符,hh 是两位十六进制数

颜色输出

echo 命令支持颜色输出。
格式:echo -e "\e[1;颜色值 输出文字 \e[0m"

颜色值颜色
30m黑色
31m红色
32m绿色
33m黄色
34m蓝色
35m洋红
36m青色
37m白色

比如:echo -e "\e[1;31m 你好 \e[0m"

标准脚本

写一个脚本文件时,你应该在文件的最上方写上这一会语句:#!/bin/bash 表示这是一个标准的脚本文件。# 是 shell 当中的注释字段,但这一句话并不是注释。

脚本执行

两种执行方式。

  1. 赋予执行权限,直接执行。 文件目录(相对、绝对路径都可以)
  2. 通过 Bash 调用脚本。 bash xxx.sh

Bash 的基本功能

alias 命令

该命令可以查看系统当中已经生效的别名。别名就是给原本的名字起一个简短的名字,让操作更简便。

设定别名:alias 别名= “原命令” 设定命令别名。通过这种方式设置的别名是临时的。当系统重启后会失效。

别名永久生效

vi ~/.bashrc —— 写入环境变量配置文件。如果是配置用户下的环境变量,则应是: vi /home/user/.hashrc 。 写入完毕后,调用 source 配置文件名 就会把这个文件调用一遍,让它直接生效。

通过命令 unalias 别名 来删除别名。

命令生效顺序

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

历史命令

在终端中,按上键可以回到上一个历史命令,按下键可以回到下一个历史命令。而在 shell 中并不支持。

history 命令

终端中有一个 history 命令。格式:

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

可以查看所有的历史命令。
选项:

  • -c 清空历史命令
  • -w 把缓存中的历史命令写入历史命令保存文件(~/.bash_history

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

历史命令的调用

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

命令和历史补全

在 Bash 中,命令与文件补全是非常方便与常见的功能。只要在输入命令或文件时,按 Tab 键就会自动进行补全或者列出你可能想要输入的内容的列表(命令补全、路径补全)。

输出重定向

标准输入输出

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

在 shell 当中,用 0 表示键盘,用 1 表示显示器,用 2 表示标准的错误输出。

标准输出重定向

符号作用
命令 > 文件以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
命令 >> 文件以追加的方式,把命令的正确输出输出到指定的文件或设备当中

比如,将 date 命令的返回内容保存到文件中,就可以输入以下命令:

date > date.log

date.log 文件就会保存命令得到的结果。通过 cat date.log 命令来查看文件内容。因此只有命令会返回结果,就可以将结果保存到文件当中。

标准错误输出重定向

符号作用
错误命令 2> 文件以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
错误命令 2>> 文件以追加的方式,把命令的错误输出输出到指定的文件或设备当中

比如你将一个命令打错了,将 date 打成 data,如果出入 data 2 >> date.log ,则在 date.log 文件当中就会写入报错信息。当输入命令正确但使用的是标准错误输出命令,则并不会像文件中写人信息。

正确和错误输出同时保存

命令描述
命令 > 文件 2>&1以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
命令 >> 文件 2>&1以追加的方式,把正确输出和错误输出都保存到同一个文件当中
命令 &> 文件以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
命令 &>> 文件以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
命令 >> 文件1 2>> 文件2把正确的输出追加到文件1中,把错误的输出追加到文件2中

标准输入重定向

命令: wc [选项] [文件名]

选项:

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

当直接输入 wc 并回车后,你可以输入任意的内容,当在按下 ctrl + d 之后,他就会返回统计的结果(行数、单词数、字符数)。

输出命令

这些命令其实用的不多。

  • wc < 文件名 就会统计该文件的行数、单词数和字符数;
  • wc << 标志内容 该命令回车后,你可以输入任意的内容,当最后输入的内容与 wc << 标志内容 中的内容标志一致时,他就会统计内容标志之前的内容的信息。(该命令用的很少)

管道符

1. 多命令顺序执行

多命令执行符格式作用
;命令1;命令2多个命令顺序执行,命令之间没有任何逻辑关系
&&命令1 && 命令2逻辑“与”,当命令1正确执行,则命令2才会执行
``

当然,不光可以两个同时执行,也可以多个命令执行。

2. 管道符

命令格式:

命令1 | 命令2

上面命令格式表示命令1的正确输出作为命令2的操作对象。命令1如果报错了,则命令2不会执行。

通配符

通配符作用
?匹配任意字符
*匹配0个或任意多个字符,也就是可以匹配任何内容
[]匹配中括号中任意一个字符
[-]匹配中括号中任意一个字符。-表示一个范围。例如:[a-z]匹配一个小写字母;[0-9]是匹配一个数字
[^]逻辑“非”,表示匹配不是中括号内的一个字符,例如:[^0-9]表示匹配一个不是数字的字符

比如:ls 命令后面可以使用通配符匹配文件。

Bash 中其他特殊字符

符号作用
''单引号。在单引号中,所有的特殊符号(如:$、`)都没有特殊含义
""双引号。在双引号中特殊符号都没有特殊含义。但是 ”$“ ”\“ ”`“是例外。拥有”调用变量的值“、”引用命令“和”转移符“的特殊含义
``反引号。反引号括起来的内容是系统命令。在 Bash 中会执行它。和 $() 作用一样,推荐使用 $() ,因为反引号容易看错
$()和反引号作用一样,用来引用系统命令
#在 Shell 脚本中,#开头的行代表注释
$用于调用变量的值,如:需要调用变量name的值,需要用$name的方式得到变量的值
\转移符。在\之后的特殊符号将失去特殊含义,变为普通字符。如:\$将输出 $ 符号,而不当做是变量引用

在 Bash 中,变量赋值格式是这样的:a=123。需要注意的是,= 两则不能有空格。

a=123
echo $a # 123(调用普通变量)

echo $(ls) # 调用系统变量
echo `ls` # 调用系统变量

b=$(ls) # 将系统变量"ls"(ls命令)赋值给b
echo $b

快捷键

快捷键功能
ctrl + c强制终止当前命令
ctrl + l清屏
ctrl + a光标移动到命令行首行
ctrl + e光标移动到命令行行尾
ctrl + u从光标所在位置删除到首行
ctrl + z把命令放入后台
ctrl + z在历史命令中搜索