目录
- 目录
- 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