目录

  • ​​目录​​
  • ​Shell概述​
  • ​​Shell是什么​​
  • ​​Shell的分类​​
  • ​脚本执行方式​
  • ​​echo输出命令​​
  • ​​第一个脚本​​
  • ​Bash的基本功能​
  • ​​命令别名与快捷键​​
  • ​历史命令​
  • ​​history命令​​
  • ​​历史命令的调用​​
  • ​​命令与文件补全​​
  • ​输入输出重定向​
  • ​​输出重定向​​
  • ​​输入重定向​​
  • ​多命令顺序执行​
  • ​​管道符​​
  • ​Shell中特殊符号​
  • ​​通配符​​
  • ​​Bash中其他特殊符号​​


Shell概述

Shell是什么

  • Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。在Linux中,我们可以认为:Linux的命令行界面就是Shell。当用户输入命令后,Shell会将命令翻译成机器能识别的0和1字符序列,发送给系统内核,系统内核再调用硬件进行执行,执行的返回结果再由内核返回给Shell,Shell再次将结果翻译成人能看懂的字符进行显示。
  • Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

Shell的分类

  Shell中有两种主要的语法类型:Bourne和C。其中,我们Linux标准Shell是Bash,属于Bourne。
  通过​​​echo $SHELL​​命令,我们可以知道,自己当前系统的Shell具体是什么。如:

echo $SHELL
/bin/bash

  Linux支持的Shell,可以通过​​/etc/shells​​文件进行查询。如:

vim /etc/shells

/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

  (其中sh和bash属于Bourne,也就是B Shell;tcsh和csh属于C Shell。C Shell一般用于Unix系统。)

脚本执行方式

echo输出命令

​echo [选项] [输出内容]​​​
选项:
  -e 支持反斜线控制的字符转换
反斜线控制的字符及其作用,如下:

控制字符

作用

\a

输出警告音

\b

退格键,也就是向左删除键

\n

换行符

\r

回车键

\t

制表符,也就是Tab键

\v

垂直制表符

\0nnn

按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数

\xhh

按照十六进制ASCII码表输出字符。其中hh是两位十六进制数

  有颜色的​​echo​​,如:

echo -e "\e[1;32mHello,Shell\e[0m"

  其中:

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

第一个脚本

(1)编写脚本,如 hello.sh(Linux不通过后缀名识别文件类型,所以可以不用​​.sh​​​作为后缀名,但是为了方便用户自身,我们约定俗称定义​​.sh​​后缀名。)

vi hello.sh

(2)脚本内容

#!/bin/bash
#The first program
echo -e "\e[1;32mHello,Shell\e[0m"

  其中​​#!/bin/bash​​​是一行注释,声明以bash运行脚本。尽管是注释,我们也不能删除掉它。在简单的shell脚本中,删除该注释不会带来什么影响,但是当脚本引入其他脚本时可能会带来运行错误。所以我们强烈要求加上这一行注释!
(3)执行脚本

  • 第一种方式:赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
  • 第二种方式:通过​​bash​​调用执行脚本
bash hello.sh

Bash的基本功能

命令别名与快捷键

(1)查看与设定别名
​​​alias​​​:查看系统中所有的命令别名。
​​​alias 别名='原命令'​​​:设定命令别名。这种方式设定的别名只是临时的,重启或注销用户,都会使别名失效。
(2)别名永久生效与删除别名
​​​vi ~/.bashrc​​:写入环境变量配置文件。系统中不只有一个环境变量配置文件。

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
~

  此时编辑完别名保存文件后,并不会立即生效。需要我们重新登录才会生效。不重新登录的方法是,执行​​source​​命令。如:

source ~/.bashrc

​unalias 别名​​​:删除别名。这里删除别名的方式真是针对​​alias​​​命令设置的别名。对于配置文件中设置的别名,需要从配置文件中删除,才能生效。
(3)命令生效顺序
命令生效顺序主要指的是执行一条命令时,采用什么查找路径或原则执行命令的。

  • 第一顺位执行用绝对路径或相对路径执行的命令。
  • 第二顺位执行别名。
  • 第三顺位执行Bash的内部命令。(通过​​whereis​​命令可以判断某个命令是否为Bash的内部命令。)
  • 第四顺位执行外部命令,即执行按照​​$PATH​​环境变量定义的目录查找顺序找到的第一个命令。

可以执行一条命令时,其别名是优先于内部命令或外部命令的。如:别名​​rm​​​命令优先于外部命令​​rm​​​的,别名为​​rm​​​的命令覆盖了原来的​​rm​​​命令。
(4)常用快捷键

Ctrl+C 强制终止当前命令
Ctrl+L 清屏(Linux命令是clear命令)
Ctrl+A 光标移动到命令行首
Ctrl+E 光标移动到命令行尾
Ctrl+U 从光标所在位置删除到行首!!!
Ctrl+Z 把命令放入后台
Ctrl+R 在历史命令中搜索

历史命令

​history​​命令

​history [选项] [历史命令保存文件]​​​
选项:
  -c 清空历史命令
  -w 把缓存中的历史命令写入历史命令保存文件 ​​​~/.bash_history​​​
  直接使用​​​history​​命令(不加任何选项和参数)可以显示出当前所有的历史命令。而在历史命令保存文件中,保存的是上次用户正确注销账户时自动保存的历史命令。当次输入的历史命令还未保存到文件中。使用

history -w

命令,可以立即将此前的历史命令保存到文件中。
  历史命令默认会保存1000条,可以在环境变量配置文件​​​/etc/profile​​​中进行修改,修改​​HISTSIZE​​对应的值。

历史命令的调用

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

命令与文件补全

  在Bash中,我们只要在输入命令或文件名、目录名时,按“Tab”键就会自动进行补全。

输入、输出重定向

输出重定向

(1)标准输入输出

设备

设备文件名

文件描述符

类型

键盘

/dev/stdin

0

标准输入

显示器

/dev/stdout

1

标准输出

显示器

/dev/stderr

2

标准错误输出

  输入设备还有很多,如鼠标,游戏手柄等,但标准的输入设备只有键盘。同样地,输出设备也有很多,如打印机,但标准的输出设备只有显示器。
(2)输出重定向
  命令的输出结果默认到屏幕、显示器。我们可以修改输出的地方或重新定义输出的方向,称之为输出重定向。

类型

符号

作用

标准输出重定向

命令 > 文件

以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中

命令 >> 文件

以追加的方式,把命令的正确输出输出到指定的文件或设备当中

标准错误输出重定向

错误命令 2> 文件

以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中

错误命令 2>> 文件

以追加的方式,把命令的错误输出输出到指定的文件或设备当中

  如:

ifconfig > test.log
cat test.log

  如果命令是正确的,那么使用标准错误输出重定向是不会有效果的。也就是说命令的运行结果不会重定向保存到文件中。只有当命令错误时才会。因此,只有我们知道命令是否正确,使用以上的输出重定向才有意义。如果我们想既保存正确结果信息又错误结果信息的话,就需要使用如下的输出重定向形式了。

类型

符号

作用

正确输出和错误输出同时保存

命令 > 文件 2>&1

以覆盖的方式,把命令的正确输出和错误输出都保存到同一个文件当中

命令 >> 文件 2>&1

以追加的方式,把命令的正确输出和错误输出都保存到同一个文件当中

命令 &> 文件

以覆盖的方式,把命令的正确输出和错误输出都保存到同一个文件当中

命令 &>> 文件

以追加的方式,把命令的正确输出和错误输出都保存到同一个文件当中

命令 >> 文件1 2>> 文件2

把正确的输出追加到文件1中,把错误的输出追加到文件2中

  另外,还有如:

ls &> /dev/null

  这种用法,表示命令的结果既不显示在屏幕上也不保存在文件中,相当于直接丢弃输出结果。

输入重定向

​wc [选项] [文件名]​​​
选项:
  -c 统计字节数
  -w 统计单词数
  -l 统计行数
  在不加文件名这个参数的情况下执行wc命令后,需要我们人为地从键盘中输入内容,输入结束按​​​Ctrl + D​​​执行wc统计输入的结果,依次统计单词数、行数、字节数。
  如果加入文件名这一参数,如:

wc test.log

  相当于重新定义了输入的方向,从文件内容进行输入,统计文件中的内容。也相当于:

wc < test.log

  而命令​​wc << flag​​​则会要求我们输入内容,直到碰到标记(这里设置的是​​flag​​)才会停止我们输入,然后统计标记之前的内容。这样命令在平常的使用中更少出现,只作为了解即可。

多命令顺序执行

多命令执行符

格式

作用

;

命令1; 命令2

多个命令顺序执行,命令之间没有任何逻辑联系

&&

命令1&&命令2

逻辑与

当命令1正确执行,则命令2才会执行

当命令1执行不正确,则命令2不会执行

||

命令1||命令2

逻辑或

当命令1执行不正确,则命令2才会执行

当命令1正确执行,则命令2不会执行

  如:

pwd; ls; date

  如显示压缩文件前的时间和压缩文件后的时间:

date; tar -zcvf ect.tar.gz /etc; date

  如命令正确执行输出”yes“,否则输出”no“(通过这种方法,可以判断输入的命令是否正确):

ls && echo yes || echo no

管道符

​命令1 | 命令2​​​:命令1的正确输出作为命令2的操作对象。因此命令2被要求能操作命令1的输出才行。
  如翻页显示ls命令的结果:

ls -l /etc | more
ll -a /etc | more

  如查看客户端连接当前Linux服务器的情况(如果有客户端连接的话):

netstat -an | grep ESTABLISHED

  如果还要统计连接服务器的数量,可以执行:

netstat -an | grep ESTABLISHED | wc -l

(补充:​​more [文件名]​​​用于分屏显示文件内容。​​netstat -an​​查看Linux中所有网络连接,其中上部分的输出显示的是本地网络端口的连接情况,下部分是本地程序的访问情况。)

Shell中特殊符号

通配符

通配符

作用

?

匹配一个任意字符

*

匹配0个或多个任意字符,也就是可以匹配任何内容

[]

匹配中括号中任意一个字符。如:[abc]代表一定匹配其中一个字符,或者是a,或者是b,或者是c

[-]

匹配中括号中任意一个字符,-代表一个范围。例如:[a-z]代表匹配一个小写字字母。

[^]

逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符。

  如列出以test开头的文件或目录:

ls test*

  注:通配符主要用于匹配文件名或者目录名称。如果我们要匹配文件中的内容,我们需要使用正则表达式。

Bash中其他特殊符号

符号

作用


单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义。只是普通的符号。

“”

双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。


反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和 $() 作用一样,不过推荐使用 $(),因为反引号非常容易看错。如:cm=`ls`,表示将ls命令的执行结果赋值给变量cm。

$()

和反引号的作用一样,用来引用系统命令。

#

在Shell脚本中,#开头的行代表注释。

$

用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。

\

转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\将输出“”符号,而不当作是变量引用。

如:

[root@localhost ~]# val=123
[root@localhost ~]# echo $val
123
[root@localhost ~]# echo '$val'
$val
[root@localhost ~]# echo "$val"
123
[root@localhost ~]# cm=`ls` #执行命令并将结果赋值给变量cm
[root@localhost ~]# echo "$cm"
anaconda-ks.cfg
[root@localhost ~]# cm2=$(ls)
[root@localhost ~]# echo $cm2 #这里可以写注释
anaconda-ks.cfg
[root@localhost ~]# echo $cm2 #输出变量的结果
anaconda-ks.cfg
[root@localhost ~]# echo \$cm #让$符号失去效果
$cm