Shell脚本应用
sehll的基本信息
shell的作用
(1)shell的作用——命令解释器 “翻译官”
- 介于系统内核与用户之间,负责解释命令行
(2)用户的登录shell - 登录后默认使用的shell程序,
一般为 /bin/bash
- 不同shell的内部指令、运行环境等会有所区别
(3)[root@localhost ~]# cat /etc/shells (显示所有的shell)
编写第一个shell脚本
(1)编写脚本代码
-
使用vi或vim编辑器
-
每行一条Linux命令,按执行顺序依次编写
[root@localhost ~]# vi first.sh(一般shell脚本的后缀都是.sh)
写入(推荐使用vim编辑器,因为会变颜色,写的时候写错了不会变颜色)
(没有的可以使用yum -y install vim 安装,一般安装了图形界面的Centos系统都会有,命令行的得自行安装)
(2)赋予可执行权限 -
使脚本具有可执行属性
(没有可执行的权限就无法运行脚本)
[root@localhost ~]# chmod +x first.sh (使用chmod给脚本加可执行权限)
(3)执行脚本文件
方法一:./脚本文件路径(使用./时最好就直接进入脚本所在目录执行即可)
方法二:sh 脚本文件路径
方法三:source 脚本文件路径 -
执行脚本
(使用./时时必须要求有x可执行权限的使用sh或source可以不用,但是还是要养成习惯给一个x权限)
方法一:[root@localhost ~]# ./first.sh
方法二:[root@localhost ~]# sh /first.sh
方法三:[root@localhost ~]# source /first.sh
(4)更完善的脚本构成 (通常都是这么写的) -
脚本声明 第一行 声明脚本的运行环境
-
注释信息 以 # 开头的行时注释行,一般会写这个脚本时干什么的等等
-
可执行语句
示例:[root@localhost ~]# vi /first.sh
#!/bin/bash(脚本声明,在/bin/bash下运行)
#这是我的第一个shell脚本(注释信息)
cd /boot(下面都是可执行语句)
echo “当前的目录位于:”
pwd
echo “其中以vml开头的文件包括:”(输出友好的提示信息)
ls -lh vml*(ls -lh 长格式更加人性化方式显示出以vml开头的文件)
[root@localhost ~]#chmod +x first.sh (添加可执行权限)
[root@localhost ~]# ./first.sh (执行脚本)
扫描二维码关注公众号,回复: 12451650 查看本文章
重定向与管道符操作
(1)交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
【类型】 【设备文件】【文件描述编号】【默认设备】
标准输入; /dev/stdin ; 0 ; 键盘
标准输出; /dev/stdout; 1 ; 显示器
标准错误输出;/dev/stderr; 2; 显示器
(2)重定向操作
【类型】【操作符】【用途】
重定向输入; < ; 从指定的文件读取数据,而不是从键盘输入
重定向输出; > ; 将输出结果保存
到指定的文件(会覆盖原文件)
重定向输出; >> ; 将输出结果追加
到指定的文件(不会覆盖原文件默认加到指定文件的末尾)
标准错误输出; 2> ; 将错误信息保存
到指定的文件(会覆盖原文件)
标准错误输出; 2>> ; 将错误信息追加
到指定的文件(不会覆盖原文件默认加到指定文件的末尾)
混合输出; &> ; 将标准输出、标准错误的内容保存到同一个文件(就是不管是对的还是错的只要是执行问前一个命令后的所有结果都保存到指定文件,会覆盖原文件)
(一个 > 是覆盖 两个>> 是追加)
重定向示例:
- uname -p > kernel.txt
cat kernel.txt
uname -p
- uname -r >> kernel.txt
cat kernel.txt
- echo “123456” > pass.txt
(利用重定向去设置用户密码)
cat pass.txt
useradd tom
passwd --stdin tom < pass.txt
- tar jcf /nonedir/etc.tgz /etc
tar jcf /nonedir/etc.tgz /etc 2>error.log (将错误信息输入到error.log文件里)
cat error.log
管道符 “|”
- 将左侧的命令输出结果,作为右侧命令的处理对象
- 格式: cmd1 | cmd2 | … | cmdn
(cmd执行的命令,可以使用管道符|一直执行)
[root@localhost ~]# grep “bash$" /etc/passwd
[root@localhost ~]# grep “bash$” /etc/passwd | awk -F: ‘{print $1,$7}’ (利用管道符和awk行处理器筛选出数据中的第一个和第七个字段 -F是用什么分割,这里是使用的是 :分割的)
示例:通过管道符和awk行处理器提取出mac地址以/挂载的使用情况
- df -hT | grep “/$” | awk ‘{print $6}’ (以/结尾挂载的使用情况)
- ip a | grep “ff:ff:ff:ff:ff:ff$” | awk ‘[print $2}’(通过grep、awk提取出mac地址)