bash的基本功能

bash的基本功能

历史命令

linux现在比较智能,可以查看到自己历史所使用过的命令

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

查看历史命令

支持的选项

-c 清空历史命令

-w 把缓存中的历史命令写入历史命令保存文件

每个用户的历史命令是单独保存的,保存在家目录下的.bash_history目录中。

我们打开历史命令保存文件看一看

vi .bash_history

我们发现我们刚敲的命令并没有记录在其中,要等登陆退出之后保存的历史命令才会写入这个文件,但是-w就可以强制写入。

history -w .bash_history

在vi一下我们发现已经写入

-c 会将文件中的也清除,建议不要清除。历史命令可以有效的帮助我们判断服务器执行了哪些命令。

更改历史命令保存条数

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

我们先打开这个文件看一看

因为是写入到文件,这个保存条数可以改大一些,这个命令是需要重新登陆才能生效的。如果历史命令超过了规定条数,会将最前面的删除。

历史命令的调用

使用上、下箭头调用以前的历史命令

使用”!n”重复执行第n条历史命令

使用”!!”重复执行上一条命令

使用”!字串”重复执行最后一条以该字串开头的命令

我们在历史命令记录文件里面可以看到历史命令前有编号,便可以利用这个进行历史命令的调用。

命令与文件补全

tab键即补全键,可以进行命令补全与目录补全,可以加速命令的输入速度。

命令别名

格式

alias 别名='原命令'

设定命令别名

alias

查询命令别名

比如我们把vim改成vi

这个时候我们再用vi的时候实际上执行的就是vim

这里我们也能看到,rm实际执行的是加了-i选项的,这也能解释为什么删除的时候会有询问。其他命令也是如此,好多都已经内置选项。

命令执行顺序

第一顺位执行用绝对路径或相对路径执行的命令

第二顺位执行别名

第三顺位执行bash的内部命令

第四顺位执行按照$path环境变量定义的目录查找顺序找到的第一个命令

PATH环境变量这里解释一下

我们echo一下path,当我们执行命令的时候,命令会按照变量中的路径一个个去找命令所在目录,如果所有路径找完都找不到,就会报错。

其实linux所有可执行文件与命令都应该用绝对变量去设置,但是命令系统默认用PATH变量去使得操作简便了。但是有些命令是找不到文件的,比如cd,因为这些命令是shell bash自带的命令。

如何永久生效

修改家目录下得bashrc
比如root:

vi /root/.bashrc

删除别名

unalias 别名

bash常用快捷键

输入输出重定向

标准输入输出

因为这些设备文件名不好记忆,所以linux中增加了文件描述符的选项。

输出重定向

输出重定向的意思是,本来是输出到屏幕上,但是这里我们重新输出到文件里,那么为什么要输出到文件呢?有一些操作是我们在人少的时候执行,以减少服务器平时的负荷,我们可以用shell来执行定时任务,我们如果不把输出保存下来的话,shell执行过程中出现的问题无法记录。当然有些命令是没有输出的,重定向也没有意义。

覆盖与追加的区别

正确输出

我们这里用ls举例子,把ls输出结果保存下来。

ls > abc

我们cat一下abc内容

cat abc

我们也知道date命令也是可以有输出的,这里我们也让他保存到abc

date > abc

我们继续cat一下看看

我们发现覆盖了结果,因为 > 是覆盖,而 >> 是追加

我们在date一次,这次用追加

date >> abc

我们发现结果已经追加

这就是追加和覆盖的结果,但是这些都是命令正确输出的结果那么要是错误输出会怎么样呢?

错误输出

比如我们随意输入一个错误命令

lst 

如果我们想把这个结果追加到abc,会出现什么情况呢?

发现操作是不可以的要是想错误结果也能保存的话,我们要加错误输出重定向。

lst 2>> abc

我们发现错误信息输出

这里注意2和>之间是不能有空格

但是这里我们也发现一个问题,就是我们要先判断命令的正确与否才能重定向,实际作用中是意义不大的,所以我们用的一般都是正确输出错误输出同时重定向的。

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

只要利用这种方法,正确错误都可以保存

这里我们要介绍一个文件

/dev/null

它是一个特殊文件,这个文件就是一个类似一个垃圾箱,不管命令的执行结果正确与否,我们不关心结果,只要执行就行,在后面我们会写一些shell,这些命令的输出对我们没有意义,所以扔到垃圾箱就好。

输入重定向

wc 【选项】 【文件名】

选项:

-c 统计字节数

-w 统计单词数

-l 统计行数

这里我们是用 wc 命令举例子

wc命令是一个统计命令

输入wc之后我们就开始输入要统计的内容ctrl + d 结束输入

这里统计结果是 5行 5个单词 21个字符

字符中包含回车符,这里统计了键盘的输入结果,选项加上以后会只统计该选项的代表值。我们这里重定向可以让它统计文件:

wc anaconda.cfg

用日志文件举例子

当然也有 >>,比如:

wc << hello

这里不再是ctrl d 结束,而是直到再碰到hello结束

多命令顺序执行与管道符

多命令执行

; 代表命令之间没有关系,即使命令一错了,命令二也会正常执行。

我们这里输入了

ls;lst;date

我们知道是没有lst命令的,所以命令二报错,而其他命令正确执行了

这样的方式可以简化操作,dd命令也有帮助。

dd if=输入文件 of=输出文件 bs=字节数 count=个数

选项

if = 输入文件 制定源文件或源设备

of = 输出文件 根据目标文件或目标设备

bs = 字节数 指定一次输入或输出多少字节,即把这些字节看作一个数据块

count = 个数 指定输入或输出多少个数据块

我们来输入以下代码:

date;dd if=/dev/zero of=/root/testfile bs=1k count=100000;date

dd是一个复制命令,不仅包括文件还可以是磁盘或者是系统

我们中间相当于创建了一个100m的文件,前后两个date命令可以让我们看到创建一个如此文件耗费了多少时间。

&&

第一个命令成功执行,第二个才会执行。

ls && echo yes

成功执行了ls并输出了yes,如果前面的命令不成功执行,则不会输出。有些命令要在其他命令基础上执行,就会用到逻辑与命令。

||

第一个命令未成功执行,第二个才会执行

由上面我们就可以写一个判断命令是否正确执行的代码

命令 && echo yes || echo no

管道符

命令一的正确输出作为命令二的操作对象

命令一必须正确而且必须有输出,命令二才可以执行

ll -a /etc/ | more

我们这样就可以分别显示命令结果,即可以看到了所有该目录下的文件,而且是分屏显示的。

netstat -an | grep "ESTABLISHED"

NETSTAT的作用是查看所有网络连接,listen代表监听,establish代表正在连接,本身是很繁琐的,我们这里用grep命令只显示正在连接的。

grep命令

grep 【选项】 “搜素内容” 文件名

选项

-i:忽略大小

-n:输出行号

-v:反向查找

–color=auot :搜索出的关键字用颜色显示

grep "root" /etc/passwd

这里我们是在passwd搜索包含root的相关内容。

我们这里加一下颜色

grep --color=auto "root" /etc/passwd

我们发现已经加上颜色了

通配符与其他特殊符号

通配符

cd /tmp/
ls
rm -rf *
ls

我们这里用*删除了所有文件

touch abc
touch abcd
touch 012
touch 0abcd

这里我们创建了这么几个文件

ls ?abc
ls [0-9]*
ls [^0-9]*

我们这里显示的分别是任意一个字符+abc、0~9开头后面加任意字符、非0~9开头的任意字符。

?代表至少有一个,所以匹配不到abc但是*是任意,所以可以匹配到abc,但是这里要注意:
通配符是完全匹配,所以*abc
代表任意内容加abc,其他的都不可以。所以abcd是不符合这个规则的

其他特殊符号

单双引号区别

这里区别单双引号的区别,单引号中的特殊符号只能是符号,而双引号中却任然可以保持部分作用。

name=sc
echo '$name'
echo "$name"
echo '$(date)'
echo "$(date)"

这里我们定义了一个名字的变量,我们发现单引号的全是原封不动的输出,但是双引号的话则输出了变量的内容。

反引号与$()区别

我们再看反引号,可以将命令赋值给变量。

abc=`date`

我们这里给abc赋值date函数,在echo输出一下试试

我们发现abc已经输出了命令的变量,但是反引号太不容易看出了,比较容易和单引号弄混,这里就可以用$()进行相同的作用。
所以上面我们的单双引号区分的例子中的date函数会有区分。

#

注释符号

$

调用变量的值

\

转义符