1.编写shell脚本环境:
1.1 编写目的:
写shell脚本时前几行内容自动加入 行缩进 语法提示 美观 等
1.2 编写步骤:
vim .vimrc ------>将vimrc-anliu 文件的内容复制粘贴到此配置文件中---->修改其个别内容。(修改时使用vim不能粘贴时 可使用vi 例如博客地址)
2.shell
2.1 用途:
使用简单,是Shell命令的集合 。
运行节省时间 可实现批量管理。
自动化 批量处理减少出错概念率。
2.2 shell概述
shell:命令解释器,shell也是一门编程语言及shell脚本.
种类:sh,bash,ksh,csh…(大多数的linux发行版 bash)
2.2.1 bash的特性:
a 历史记录 ----> 用户行为升级
b 别名 ----> 企业垃圾桶,rm --》mv
c 补全 ----> 命令($PATH),目录
d 支持通配符 ---->*,[],[^]
e 前后台作业 ---->jobs, & ,bg,fg
f 运行脚本
系统shell类型 cat /etc/shells
默认shell echo $SHELL
2.2.2 bash 安全性:
[root@localhost ~]# env x='(){:;}; echo be careful ' bash -c "echo this is a test"
this is a test
如果返回
be careful
this ia a test
则需要升级系统。
[root@localhost ~]# yum -y update bash
[root@localhost ~]# rpm -qa bash
2.3 shell的建立
2.4 shell的执行
a 通过sh或者bash命令执行
[root@bogon test]# bash useradd.sh
[root@bogon test]# sh useradd.sh
b 直接运行,脚本必须要有可执行权限
[root@bogon test]# /root/test/useradd.sh
c 通过. 或者source 执行,在文件中的变量,函数的返回值将会加载到父及bash环境中。
[root@bogon test]# . useradd.sh
[root@bogon test]# source useradd.sh
在脚本中定义的变量时局变量,
在命令行可以echo $hanhan 的是全变量,
d 通过重定向,说明bash和sh是可以接受标准输入的。
[root@bogon test]# bash < test.sh
[root@bogon test]# sh < test.sh
3.shell脚本
3.1 脚本的注释
单行注释:#
多行注释:
:<<BLOCK
BLOCK
3.2 脚本规范
3.2.1 开头指定脚本解释器
#!/bin/sh或#!/bin/bash
其他行#表示注释
名称见名知义 backup_mysql.sh,以sh结尾
3.2.2开头加版本版权等信息
#Date:创建日期
#Author:作者
#Mail:联系方式
#Function:功能
#Version:版本
3.2.3 脚本中尽量不用中文注释
别吝啬添加注释,必要的注释方便自己别人理解脚本逻辑和功能;
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰;
单行注释,可以放在代码行的尾部或代码行的上部;
多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分
代码修改时,对修改的内容
3.2.4 多使用内部命令
内部命令可以在性能方面为你节省很多。
type 命令。
3.2.5 没有必要使用cat命令,尽量少使用管道。
eg:cat /etc/passwd | grep guru
使用以下方式即可
eg:grep guru etc/passwd
3.2.6 代码缩进
3.2.7 仔细阅读出错信息
有时候我们修改了某个错误并再次运行后,系统依旧会报错。然后我们再次修改,但系统再次报错。这可能会持续很长时间。
但实际上,旧的错误可能已经被纠正,只是由于出现了其它一些新错误才导致系统再次报错
3.2.8脚本以.sh为扩展名
eg:script-name.sh
4 shell变量
查看:
env: 系统的全局变量
set: 所有的全局变量
declare: 所有导入的全局变量和函数
4.1定义全局变量
[root@bogon test]# export a="123"
[root@bogon test]# b=456
[root@bogon test]# export b
4.2局部变量的定义
‘’ : 强引
“” :弱引
`` : 执行Shell命令
[root@server02 ~]# a=192.168.42.1
[root@server02 ~]# echo "a=$a" #弱引
a=192.168.42.1
[root@server02 ~]# b=a-$a #没有加引号,也没解析变量
[root@server02 ~]# echo $b
a-192.168.42.1
[root@server02 ~]# b='a-$a' #强引
[root@server02 ~]# echo $b
a-$a
[root@server02 ~]# a=date
[root@server02 ~]# echo $a
date
[root@server02 ~]# echo `$a`
2020年 06月 19日 星期五 17:51:45 CST
永久生效
/etc/profile(/etc/profile.d/*),~/.bash_profile,~/.bashrc,/etc/bashrc
tee命令: tee命令用于读取标准输入的数据,并将其内容输出成文件。
参数:
-a或--append 附加到既有文件的后面,而非覆盖它.
-i或--ignore-interrupts 忽略中断信号。
--version 显示版本信息。
5. shell中常见的固定性的内容的生成
5.1 加密码 (文件一样 加密码一样 文件不一样 加密码就不一样)
Centos 6:
grub-md5-cryp
grub-md5-crypt >> /etc/grub.conf
grub-md5-crypt |tee -a /etc/grub.conf
Centos 7:
(grub:搜索mkpasswd:生成随机密码)
grub2-mkpasswd-pbkdf2
5.2 md5文件校验码:
[root@bogon test]# md5sum passwd1
56cf56372303c1c769ec0d030144e60c passwd1
[root@bogon test]# md5sum passwd
911bc5a50ff7cb7e2de6addb28c94abe passwd
5.3生成自然数:
方法一:
[root@bogon test]# echo {001..100}
[root@bogon test]# echo {1..100}
实例:
#!/bin/bash
#Author:Anliu
#Blog: https://i.cnblogs.com/posts?cateId=1583983
#Time:2020-06-19 18:26:33
#Name:num.sh
#Version:V1.0
#Description:This is a test script.
read -p "请输入起始值:" sta
read -p "请输入终止值:" sto
for i in `eval echo {$sta..$sto}`
do
echo $i
done
总结:bash不会解析多层变量,eval命令能解析多层变量。
[root@bogon test]# set 11 22 33 44
[root@bogon test]# echo $4
44
[root@bogon test]# echo $# #打印参数的个数
4
[root@bogon test]# echo \$$#
$4
[root@bogon test]# eval echo \$$#
44
方法二:
seq命令用于产生从某个数到另外一个数之间的所有整数。
seq [选项]… 尾数
seq [选项]… 首数 尾数
seq [选项]… 首数 增量 尾数
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
[root@localhost ~]# seq -f "%3g" 8 12
[root@localhost ~]# seq -f "%03g" 8 12
[root@localhost ~]# seq -w 8 12
[root@localhost ~]# seq -s" " -f"str%02g" 9 11
[root@localhost ~]# seq -s"`echo -e "\t"`" 9 11
[root@localhost ~]# seq -s"`echo -e "\n"`" 9 11
root@localhost ~]# seq -s"=" 9 11
5.4 随机数生成:
方法一: $RANDOM (random :随机)
[root@localhost test]# echo $RANDOM
[root@bogon test]# cat random.sh
#!/bin/bash
#Author:Anliu
#Blog: https://i.cnblogs.com/posts?cateId=1583983
#Time:2020-06-20 09:11:09
#Name:random.sh
#Version:V1.0
#Description:This is a test script.
function rand(){
min=$1 #400000
max=$(($2-$min+1)) #500000-400000+1 100001
num=$(($RANDOM+1000000000)) #增加一个10位的数再求余 #4012 +10000000000 = 1000004012
echo $(($num%$max+$min)) # 1000004012%100001 +400000 < 100001 +400000 < 500000;
}
read -p "please input your num of start:" sta
read -p "please input your num of end:" sto
rnd=$(rand $sta $sto)
echo $rnd
exit 0
方法二:openssl
[root@bogon test]# openssl rand -base64 8 |md5sum |cut -c 1-12
[root@bogon test]# openssl rand -base64 8 |cksum |cut -c 1-10 #最大十位
5.5 生成UUID:
[root@bogon test]# uuidgen
[root@bogon test]# cat /proc/sys/kernel/random/uuid
5.6生成MAC:
[root@bogon test]# echo "00:0c:29:`openssl rand -hex 3 | sed 's/\(..\)/\1:/g; s/.$//'`"