1.什么是shell脚本
shell脚本是一种解释型语言(c语言是描述型语言),用shell脚本保存执行动作,用脚本判断命令执行的条件,用脚本来实现动作的批量执行。一个shell程序,又被称作一个脚本,shell脚本是将各种命令通过逻辑语句组合而成的程序,是一种很容易使用的工具,它可以通过将系统调用公共程序,工具和编译过的二进制程序粘和在一起来建立应用。
1.2shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
1.3shell的作用
- 批处理
- 定时性
- 便捷灵活的管理系统任务和其他重复工作的过程
1.4shell的脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- …
2.关于shell的命令和语言
[root@localhost ~]# cat /etc/shells #查看系统中存在的shell脚本
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
进入的编译环境不同,所具备的功能也一定会有所不同
[root@localhost ~]# sh #直接输入命令,可以直接进入到sh的编译环境
sh-4.2#
3.写shell脚本
3.1简单的脚本
[root@localhost ~]# vim first.sh #first为脚本名称其他为固定用法
#!/bin/bash #声明解释器
<<COMMENT #<<注释,并不会执行(COMMENT可变但必须结尾一样)
很简单的脚本
COMMENT
或者跟#
#很简单的脚本 #这样注释也可以
echo "hello world!!!!" #所见即所得
如下图
3.3如何运行脚本
[root@localhost ~]#chmod +x first.sh #给脚本可执行权限
[root@localhost ~]#./first.sh #然后./执行
hello world!!!!
[root@localhost ~]# bash first.sh #或者直接调用bash来运行
hello world!!!!
或者用下面的类型执行脚本
[root@localhost ~]# . first.sh
hello world!!!!
[root@localhost ~]# source first.sh
hello world!!!!
3.4创建脚本示例
首先创建一个脚本并进入直接编写
[root@localhost ~]# vim cp.sh
#!/bin/bash
mkdir x
cd x
touch y
mv y /opt
[root@localhost ~]#bash ./cp.sh
[root@localhost ~]# ls /opt
rh y
重定向
< #从指定的文件读取数据,而不是从键盘输入
> #将输出结果保存到指定文件,会覆盖文件原内容
>>: #将输出结果追加到文件内的尾部
2> #将错误信息保存到指定文件,覆盖文件内容
2>> #将错误信息追加到指定文件中
&> #将标准输出、标准错误的内容保存到同一个文件中
整数变量的计算
expr 变量名 运算符 变量名
echo $[ 变量运算符变量 ] 也可以是 :echo $(( 变量运算符变量 ))
[root@localhost ~]# expr 2 + 2 #加法
4
[root@localhost ~]# expr 5 - 2 #减法
3
[root@localhost ~]# expr 5 % 1 #取余数(5可以被整除光所有没有余数)
0
[root@localhost ~]# expr 5 % 2 #取余数(5等于2*2+1,所有余数为1)
1
[root@localhost ~]# expr 3 / 2 //取整数(除法,无线逼近目标数字)
1
[root@localhost ~]# expr 1 / 2
0
[root@localhost ~]# a=1 #赋值,并计算
[root@localhost ~]# b=5
[root@localhost ~]# echo $[ $a+$b]
6
[root@localhost ~]# echo $[ 2**8 ] #计算次方
256
[root@localhost ~]# echo $[ 2**7 ]
128
[root@localhost ~]# echo "9.99+1" | bc #计算带小数点的值
10.99
4.变量
变量名:字母、数字、下划线组成、不能是数字开头,区分大小写。不能事特殊符号
unset a #取消变量
4.1预定义变量
$# #表示命令行中位置参数的个数
#@ #表示所有位置参数,只是列出以单个形式列出
$* #表示所有位置参数的内容
$? #表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常
$$ #表示返回当前进程的进程号
$! #返回最后一个后台进程的进程号
$0 #表示返回当前进程的进程号
4.2自定义变量
#!/bin/bash
创建用户张三并且密码是123
user=zhangsan
passwd=123
useradd $user
echo "$passwd" | passwd --stdin $user
优化后即可以输入想创建的用户并自定义密码,最后可以查看用户是否创建成功
#!/bin/bash
read -p "请输入用户名:" user
read -p "请输入密码:" passwd
useradd $user
echo "$passwd" | passwd --stdin $user
id $user
[root@localhost ~]# bash gg.sh
请输入用户名:lisi
请输入密码:123
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
uid=1046(lisi) gid=1046(lisi) 组=1046(lisi)
4.3环境变量
- 系统已定义好的全局变量,其变量名必须是大写
env :查看系统中所有的环境变量
vim /etc/profile :编辑环境变量,可以永久性添加环境变量
[root@localhost ~]# export aa=10 #临时将自定义变量加入环境变量中
[root@localhost ~]# env | grep aa
aa=10
[root@localhost ~]# export PATH=$PATH:/root #临时将/root目录加入环境变量中
4.4位置变量
[root@localhost ~]# vim ss.sh
#!/bin/bash
echo $0 #$0表示当前执行的脚本
echo $1 #$1表示第一个参数
echo $2 #$2表示第二个参数
echo $n #表示第n个参数
[root@localhost ~]# chmod +x ss.sh //给予文件可执行权限
[root@localhost ~]# ./ss.sh a b //脚本有位置变量,在执行脚本时需要根据位置变量添加参数
./ss.sh
a
b
[root@localhost ~]# vim user.sh
#!/bin/bash
#创建用户
useradd $1
echo "$2" | passwd --stdin $1
[root@localhost ~]# chmod +x user.sh
[root@localhost ~]# ./user.sh zhangsan 123
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
示例
#!/bin/bash
#本地的yum源
mount /dev/sr0 /mnt
mkdir /etc/yum.repos.d/bak/
mv /etc/yum.repos.d/* /etc/yum.repos.d/bak
echo "[centos7]
name=centos7
baseurl=file:///mnt
enabled=1
gpgcheck=0" >>/etc/yum.repos.d/yum/repo
yum repolist
#!/bin/bash
name=`whoami`
p=`pwd`
h=`hostname`
time=`date +%Y-%m-%d\ %H:%M:%S`
pid=`ps -ef | wc -l`
user=`users | wc -w`
echo -e "----------------------------------------------------------------------\e["
echo -e "\e[1;32m# System Info Table \e[3;70H#\e[0m"
echo -e "\e[1;31m# 当前登陆用户为:$name \e[4;70H#\e[0m"
echo -e "\e[1;33m# 当前登录目录为:$p \e[5;70H#\e[0m"
echo -e "\e[1;34m# 当前登录主机为:$h \e[6;70H#\e[0m"
echo -e "\e[1;35m# 当前系统时间为:$time \e[7;70H#\e[0m"
echo -e "\e[1;32m# 当前系统运行的进程数为:$pid \e[8;70H#\e[0m"
echo -e "\e[1;34m# 当前系统登录的用户数为:$user \e[9;70H#\e[0m"
echo -e "\e[1;31m# 任何问题请联系:111222333444 \e[10;70H#\e[0m"
echo -e "----------------------------------------------------------------------\e["