一、Shell脚本概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种shell控制语句以完成更复杂的操作
Shell脚本
将平时使用的各种linux命令按顺序保存到一个文本文件中,然后添加可执行权限,这个文件就成为一个shell脚本了
应用场景
重复性操作
交互性任务
批量事务处理
服务运行状态监控
定时任务执行
shell作用
命令解释器,翻译官
介于系统内核及用户之间,负责解释命令行
用户的登录Shell ===>type 可以查看是内部还是外部指令
登录后默认适合用的Shell程序,一般为/bin/bash
不通Shell的内部指令、运行环境等会有所区别
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
......
编写第一个Shell脚本
编写脚本代码
使用vim文本编辑器
每行一条Linux命令,按执行顺序依次编写
[root@localhost ~]# vim first.sh
#!/bin/bash
cd /boot/ #进入到boot目录
pwd #显示当前所在的绝对路径
ls -lh vml* #显示以vml开头的信息
赋予可执行权限
使脚本具有可执行属性
[root@localhost ~]# chmod +x first.sh #添加执行权限
执行脚本文件
方法一:sh脚本文件路径(绝对路径与相对路径)———不需要可执行权限
[root@localhost ~]# sh first.sh
方法二:./脚本文件路径(绝对路径与相对路径)———需要可执行权限
[root@localhost ~]# ./first.sh
方法三:source脚本文件路径(绝对路径与相对路径)———不需要可执行权限,但会自动切入脚本环境
[root@localhost ~]# source first.sh
二、完整脚本格式构成
- 脚本声明
- 注释信息
- 可执行语句
双引号里面的是字符串
[root@localhost ~]# vim /first.sh
#!/bin/bash
#This is my first Shell-Script.
cd /boot
echo "当前的目录位于:"
pwd
echo "其中以vml开头的文件包括:"
ls -lh vml*
三、重定向与管道操作
类型 | 设备文件 | 文件描述编号 | 默认设备 | 用途 |
---|---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 | 从该设备接收用户输入的数据 |
标准输出 | /dev/stdout | 1 | 显示器 | 通过该设备向用户输出数据 |
标准错误输出 | /dev/stderr | 2 | 显示器 | 通过该设备报告执行出错信息 |
重定向操作
在实际的linux系统维护中,可以改变输入,输出内容的方向,而不使用默认的标准输入,输出设备(键盘和显示器),这样操作称为重定向。
重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
---------- | >> | 将输出结果追加到指定的文件尾部 |
标准错误输出 | 2> | 将错误信息追加到指定的文件(覆盖原有内容) |
----------- | 2>> | 将错误信息追加到指定的文件中 |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
例:重定向输入(免交互改密码)
[root@localhost ~]# vim pass.txt
666666
[root@localhost ~]# useradd lisi
[root@localhost ~]# passwd -- stdin lisi > pass.txt
更改用户lisi的密码
身份验证令牌yigengxin
重定向输出:">“用于覆盖,”>>"用于追加文件
例:uname -p > kernel.txt #显示cpu的类型覆盖到kernel.txt
uname -p >> kernel.txt #显示cpu的类型并追加到kernel.txt
错误重定向:"2>"用于覆盖,"2>>"用于追加文件
例:./first.sh 2> error.txt #显示first.sh的错误覆盖到kernel.txt
./first.sh 2>> kernel.txt #显示first.sh的错误并追加到kernel.txt
管道
管道操作符号"|"
将左侧的命令输出结果,作为右侧命令的处理对象
cmd1 | cmd2 [… | cmdn]
[root@localhost ~]# grep "bash$" /etc/password
root:x:0:0:root:/root:/bin/bash
teacher:x:500:500:BENET Linux Teacher:/home/teacher:/bin/bash
[root@localhost ~]# grep "bash$" /etc/passwd | awd -F: '{print$1,$7}'
root /bin/bash
teacher /bin/bash