一、理解什么是shell
- shell,中文名壳,保护内核。用来形象描述用户,操作系统以及硬件之间的相互关系。
- 电脑的运行离不开硬件,但是用户却无法直接对硬件进行操作,对硬件的操作只能通过一个称为“操作系统(Operating System)”的软件来控制。事实上,我们每天所讨论的linux,严格意义上来说只是一个操作系统,我们称之为“核心(kernel)”。然而,从使用者的角度来说,使用者也没办法直接操作kernel,而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel进行沟通。这也是kernel与shell的形象命名关系。
- 系统是多任务多用户,能一次同时处理多个任务,操作系统中的内核(一段程序)是程序调度器,来决定任务调度、优先级。
- 内核外部加一个保护罩(shell),将其保护起来,不让外界与其直接沟通(防止第三方软件会篡改内核信息,使其优先调度等),shell将好的东西传递给内核,不好的过滤掉。
二、shell脚本存在的意义
- Shell Script [1] ,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。
- 由程序与逻辑组成
是一种解释型语言,首先开启一个解释器,再进行执行,速度慢。(c语言是描述型语言,需要编译不需要解释,速度快)是一种命令 - shell python perl 都是解释型语言,解释器均为各自对应名称
- 脚本中写的是系统可以运行的文本,用文本名称来运行文本的文件叫脚本,用来批量处理
- 功能:记录系统当中的操作步骤
三、创建简单的shell脚本
vim text.sh #.sh规范,编写脚本
#!/bin/bash #幻数#!指定脚本使用的解释器。是脚本执行时最先执行的程序,写成什么脚本就用什么执行
watch -n1 date
sh text.sh #执行脚本
ps f #查看,用哪个解释器执行就显示开启的子shell为哪个
四、执行shell脚本
sh scripts.sh #开启了一个子shell
source scripts.sh #没开启子shell,让程序在当前环境运行,快
. scripts #没开启子shell,让程序在当前环境运行,快
chmod +x scripts.sh
./scripts #需加执行权限,用文件中解释器调用
五、调试shell脚本
sh -x scripts.sh 适用于所有的脚本
#脚本必须有执行权限
chmod +x scripts.sh #加执行权限
scripts.sh #直接执行脚本
vim /mnt/scripts.sh
六、在/etc/vimrc中添加自动脚本直接调用内容
vim /etc/vimrc
快捷键方式:
map <F9> ms:call JB()<cr>'s
map 映射
F9 快捷键
0表示第一行
call JB() 调用执行JB()
测试:
vim text.sh #刚进来为空白页面
按下快捷键F9:
文件属性方式:
utocmd BufNewFile *.sh exec ":call JB()" #当文件状态是新的并且是以.sh结尾时,自动执行调用call JB()
vim text.sh
自动生成:
七、用脚本执行命令
1、执行ip_show.sh 显示当前主机的ip
#!/bin/bash
echo "host ipaddress:
`ifconfig | awk '/inet\>/&&!/127.0.0.1/{print $2}'| sed 's/^/ /g'`" #ifconfig查看当前主及IP信息,抓取inet开头且后边没有任何字符的行,过滤掉127.0.0.1打印出第二列字符串,将抓取到的打印内容通过管道符进行sed命令行编辑,sed将全文开头替换成一个tab键的距离
2、执行user_show.sh 显示当前主机中能登陆系统的用户
#!/bin/bash
echo "Login user list:
`awk -F : '/bash$/||/sh$/||/csh$/||/tcsh$/{print $1}' /etc/passwd | sed 's/^/ /g'`" #awk抓取以:作为分隔符,所有行中以系统中可用shell结尾的行对应的第一行,将抓取到的打印内容通过管道符进行sed命令行编辑,sed将全文开头替换成一个tab键的距离
3、执行host_message.sh 显示当前主机的名称,ip,以及能够登陆系统的用户
#!/bin/bash
echo "hostname: `hostname`" #反向单引号是指在命令中首要执行的内容
echo "host ipaddress:
`ifconfig| awk '/inet\>/&&!/127.0.0.1/{print $2}' | sed 's/^/ /g'` "
echo "Login user list:
`awk -F : '/bash$/||/sh$/||/csh$/||/tcsh$/{print $1}' /etc/passwd | sed 's/^/ /g'`"
4、clear_log.sh 执行命令后可以清空日志
#!/bin/bash
[ "$USER" = "root" ]&&{ #只有执行脚本的用户为root才可以执行&&操作
> /var/log/messages
}||{
echo -e "\033[31mThis script must run with root!!!\033[0m"
}
#$USER指执行该脚本的用户