Shell 基础

shell 介绍

Shell 是一个命令解释器,提供用户与机器的交互,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
我们所接触学习的是 bash shell,属于 Bourne shell 类型。另外还有其他如 C Shell、Korn Shell 等。

  • shell 是一种脚本语言

  • 可以使用逻辑判断、循环等语法

  • 可自定义函数

  • shell 是系统命令的集合


history

在用户的家目录下,.bash_history 保存了用户最近输入过的命令(最多 1000 条,由环境变量而定)。

[root@dl-001 ~]# history		//查看使用过的命令历史
。。。。。。。。。。。。。。。。。。。
 993  cd /data/wwwroot
 994  ls
 995  init 0
 996  echo $HISTSIZE
 997  echo
 998  echo $HISTSIZE
 999  vim /etc/profile
 1000  cal
 1001  cla
 1002  cal
 1003  date %F
 1004  date +%F
 1005  history
 
[root@dl-001 ~]# echo $HISTSIZE		//查看可以存放命令历史的数量
1000
//说明:如果想要修改此函数的数量可以编辑/etc/profile 修改  HISTSIZE=1000,为想要的数字即可,如2000,完成后需要source /etc/profile。

给命令历史添加时间戳

[root@dl-001 ~]# vim /etc/profile

HISTTIMEFORMAT="%Y%m%d %H:%M:%S "	//添加此时间格式配置

[root@dl-001 ~]# source /etc/profile

[root@dl-001 ~]# history	//查看
 1003  20171227 09:34:19 date %F
 1004  20171227 09:34:22 date +%F
 1005  20171227 09:37:53 history
 1006  20171227 09:43:31 echo $HOSTSIZE
 1007  20171227 09:43:42 echo $HISTSIZE
 1008  20171227 09:48:17 vim /etc/profile
 1009  20171227 09:51:00 source /etc/profile
 1010  20171227 09:51:20 history

[root@dl-001 ~]# chattr +a /root/.bash_history		//给予.bans_history隐藏权限 +a,其不会受限于1000条的规则,并可以永久保存

小技巧

[root@dl-001 ~]# pwd		//查看当前目录
/root
[root@dl-001 ~]# !!		//执行上一条命令
pwd
/root
[root@dl-001 ~]# !1002		//执行命令历史中的第1002条命令
cal
     十二月 2017    
日 一 二 三 四 五 六
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[root@dl-001 ~]# !echo		//执行最近一次带有echo的命令
echo $HISTSIZE
1000

(reverse-i-search)`echo': echo $HISTSIZE	//Ctrl+r 可以模糊查询最近的一条命令。

命令补全

在 centos 中支持 tab 键命令补全,在 centos 7 中不仅支持命令补全,还支持参数补全。但需要安装一个依赖包 bash-completion, 安装完成后必须重启才可以生效。


通配符


[root@dl-001 ~]# ls		//显示所有文件
1_heard.txt  1_sorft.txt  222    anaconda-ks.cfg  dir
1q           1.txt        2.txt  dd               root@192.168.111.127

[root@dl-001 ~]# ls 1*.txt		//显示以1开头并且以.txt结尾的文件
1_heard.txt  1_sorft.txt  1.txt

[root@dl-001 ~]# ls [0-9].txt	//显示以0-9开头并且以.txt结尾的文件
1.txt  2.txt

[root@dl-001 ~]# ls {1,12}.txt		//显示开头是1或者12并且结尾是.txt的文件。
ls: 无法访问12.txt: 没有那个文件或目录	//由于本目录下没有12.txt,所以报错.
1.txt


输入输出重定向

> : 重定向
>>: 追加重定向
2>: 错误重定向
2>> :错误追加重定向
<:输入重定向

[root@dl-001 dd]# ls
1.txt  2.txt  3.txt

[root@dl-001 dd]# cat 1.txt 2.txt // 查看 1.txt 文件和 2.txt 文件
hello , I am the 1 file
hello , I am the 2 file
[root@dl-001 dd]# cat 1.txt > 2.txt && cat 2.txt // 将 1.txt 文件重定向 (相当于替换) 到 2.txt 文件中,并且查看 2.txt 文件。
hello , I am the 1 file

[root@dl-001 dd]# cat 1.txt >>2.txt && cat 2.txt // 将 1.txt 文件追加 (在原本文件数据的基础上添加数据) 到 2.txt 文件中,并且查看 2.txt 文件。
hello , I am the 1 file
hello , I am the 1 file

[root@dl-001 dd]# dsfgsd 2>> 3.txt // 将错误信息追加重定向到 3.txt 文件中。
[root@dl-001 dd]# cat 3.txt
-bash: dsfgsd: 未找到命令

[root@dl-001 dd]# ls 1.txt z.txt >1.txt 2>y.txt // 把错误信息和正确信息全部重定向到文件
[root@dl-001 dd]# cat 1.txt
1.txt
[root@dl-001 dd]# cat y.txt
ls: 无法访问 z.txt: 没有那个文件或目录

[root@dl-001 dd]# ls 1.txt 6.txt > 1.txt 2>&1 // 把错误信息和正确信息全部重定向到文件
[root@dl-001 dd]# cat 1.txt
ls: 无法访问 6.txt: 没有那个文件或目录
1.txt




----------