(1)shell的用途
- 使用简单,是Shell命令的集合
- 运行节省时间
- 可实现批量管理,自动化
- 批量处理减少出错概念率
(2)shell概述
- shell:命令解释器,也是一个程序
- 种类:sh,bash,ksh,csh…
- 大多数的linux发行版 bash
bash的特性:
a 历史记录 ----> 用户行为升级
b 别名 ----> 企业垃圾桶,rm --》mv
c 补全 ----> 命令($PATH),目录
d 支持通配符 ---->*,[],[^]
e 前后台作业 ---->jobs, & ,bg,fg
f 运行脚本
系统shell类型 cat /etc/shells
默认shell echo $SHELL
(3)shell的建立
a 登录(交互)式Shell和非登录(交互)式Shell
-
登录式Shell:环境变量文件加载顺序 /etc/profile(/etc/profile.d/*),/.bash_profile,/.bashrc,/etc/bashrc
登录式shell场景:输入用户名和密码,“su - test002” -
非登录式Shell:环境变量文件加载顺序 /.bash_profile,/.bashrc,/etc/bashrc ;
非登录式shell场景:“su test002”,定时计划任务,ansible的playbook。
b shell执行:加载环境变量ENV,该变量制定了环境文件(/etc/profile(/etc/profile.d/*),/.bash_profile,/.bashrc,/etc/bashrc) —》执行内容
(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
(5)Shell脚本的注释
单行注释:#
多行注释:
<<BLOCK
BLOCK
(6)shell脚本规范
-
1、开头指定脚本解释器
#!/bin/sh或#!/bin/bash
其他行#表示注释
名称见名知义 backup_mysql.sh,以sh结尾 -
2、开头加版本版权等信息
#Date:创建日期
#Author:作者
#Mail:联系方式
#Function:功能
#Version:版本 -
3、脚本中尽量不用中文注释
别吝啬添加注释,必要的注释方便自己别人理解脚本逻辑和功能;
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰;
单行注释,可以放在代码行的尾部或代码行的上部;
多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分
代码修改时,对修改的内容 -
4、多使用内部命令
内部命令可以在性能方面为你节省很多。
type 命令。 -
5、没有必要使用cat命令,尽量少使用管道。
eg:cat /etc/passwd | grep guru
使用以下方式即可
eg:grep guru etc/passwd -
6、代码缩进
-
7、仔细阅读出错信息
有时候我们修改了某个错误并再次运行后,系统依旧会报错。然后我们再次修改,但系统再次报错。这可能会持续很长时间。
但实际上,旧的错误可能已经被纠正,只是由于出现了其它一些新错误才导致系统再次报错 -
8、脚本以.sh为扩展名
eg:script-name.sh -
9、shell变量
查看:env: 系统的全局变量
set: 所有的全局变量
declare: 所有导入的全局变量和函数
定义全局变量
export a=“123”
b=456
export b
局部变量的定义
‘’ : 强引
“” :弱引
`` : 执行Shell命令
(7)shell中常见的固定性的内容的生成
1、加密码:
-
Centos 6:
grub-md5-cryp -
Centos 7:
grub2-mkpasswd-pbkdf2
2、生成自然数
- 方法一:
echo {001…100}
echo {1…100} - 方法二:
seq命令用于产生从某个数到另外一个数之间的所有整数。
seq [选项]… 尾数
seq [选项]… 首数 尾数
seq [选项]… 首数 增量 尾数
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
3、随机数生成:
- 方法一: $RANDOM
function rand(){
min=KaTeX parse error: Expected 'EOF', got '#' at position 4: 1 #̲400000 max=(( 2 − 2- 2−min+1)) #500000-400000+1 100001
num= ( ( (( ((RANDOM+1000000000)) #增加一个10位的数再求余 #4012 +10000000000 = 1000004012
echo ( ( (( ((num% m a x + max+ 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
openssl rand -base64 8 |md5sum |cut -c 1-12
openssl rand -base64 8 |cksum |cut -c 1-10 #最大十位
4、生成UUID: - uuidgen
- cat /proc/sys/kernel/random/uuid
5、生成MAC:
- echo “00:0c:29:
openssl rand -hex 3 | sed 's/\(..\)/\1:/g; s/.$//'
”
(8)命令排序
- ; 拼接多个命令没有逻辑关系
- && 拼接多个命令,有逻辑关系
- || 拼接命令,有逻辑关系
注意:
command & 后台执行
command &>/dev/null 混合重定向(标准输出1,错误输出2)
command1 && command2 命令排序,逻辑判断
(9)位置变量
$0,
$1,$2 …
9
,
9,
9,{10},${11} … # 接收脚本或者函数的位置参数。
$0 文件名,若执行脚本时带有路径,会将路径和将本名同事输出。
$# 表示参数的个数
(10)状态变量
$? :(1)判断上一条命令是否执行成功,成功则返回0,不成功则返回非0;
(2)获取脚本的exit的退出码
(3)获取的是函数的返回值
- 实例:监控web服务状态是否正常
思路:a 判断进程:[root@bogon test]# ps -ef |grep httpd
[root@bogon test]# killall -0 httpd
b 判断端口:[root@bogon test]# netstat -tunalp |grep 80
c 判断链接:[root@bogon test]# curl 127.0.0.1
(11)字符串操作
- 定义:
a=daahufsuufsdghfgdiha
a=“cnsjv dsjf dshs”
a=‘afnkjs$a##w*l’ - 查看:
echo $a
echo a a f h k j s f j s d f j d s k f a s l i {a} afhkjsfjsdfjdskfasli aafhkjsfjsdfjdskfaslialkdahkjf - 获取字符串长度:
echo ${#a}
截取子串:
[root@bogon test]# echo ${a:4} #从第5个位置开始取子串
[root@bogon test]# echo ${a:4:1} #从第5个位置开始取1个字符
[root@bogon test]# echo ${a#wl} #从左向右最短匹配
[root@bogon test]# echo ${a##wl} #从左向右最长匹配
[root@bogon test]# echo ${a%lx} #从右往左最短匹配
[root@bogon test]# echo ${a%%lx} #从右往左最长匹配
[root@bogon test]# echo ${a/l*x/00000} #最大范围匹配到的字符替换
[root@bogon test]# echo ${a/l/0} #从左向右替换第一个匹配到的字符
[root@bogon test]# echo ${a//l/0} #从从往右替换所有匹配到的字符
补充:
sed 【参数】‘petter command1;command2’
[root@bogon ~]# sed -n ‘s/linux/LINUX/g;p’ a
p: sed 的打印命令,打印所有行
[root@bogon ~]# sed -n ‘s/linux/LINUX/gp’ a
p: sed的替换命令的label,打印匹配到的行
(12)字符串的特殊变量扩展
echo ${parameter:-word} :如果parameter为空,则输出word,parameter本身没有发生变化;如果不为空输出parameter的值。
echo ${parameter:=word} :如果parameter为空,则输出word,parameter已经赋予word的值;如果不为空输出parameter的值。
echo ${parameter:?word} :如果parameter为空,则输出word,此时word将是错误输出的提示,echo $? 返回值为1;如果不为空输出parameter的值。
echo ${parameter:+word} :如果parameter为空,则输出空,如果不为空输出word,parameter本身没有发生变化。
(13)shell中的数值计算
命令:
-
1、(()) :既能做数值运算,又能做数值比较
[root@bogon test]# a=$((1+1))
[root@bogon test]# echo a
a
[root@bogon test]# echo $a
2 -
2、 let :数值运算
[root@bogon test]# let a=1+2
[root@bogon test]# echo $a
3 -
3、expr :数值运算(判断是否为数字),字符串对比(判断两字符串是否一致),求字串长度
[root@bogon test]# expr 1 + 2
3
[root@bogon test]# expr 1 * 2
2
[root@bogon test]# expr 1 / 2
0
[root@bogon test]# expr 1 % 2
1
(14)条件测试
test 表达式 #判断文件,目录等待参数(-f)的场景
[ 表达式 ] #判断文件,目录等待参数(-f)的场景;判断数值,-eq,-lt,-gt; -a,-o ,!
[[ 表达式 ]] #判断文件,目录等待参数(-f)的场景;判断数值,>,<,; &&,||,!;匹配正则
((表达式)) #判断数值,>,<,。
(15)输出内容添加颜色
echo -e “\033[5;42;31m USER: basename $0
[start|stop|restart] \033[0m”
echo -e “\033[42;31m USER: basename $0
[start|stop|restart] \033[0m”
40-47;30-37