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函数会有区分。
#
注释符号
$
调用变量的值
\
转义符