Shell脚本

(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- 2min+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##w
l} #从左向右最长匹配
[root@bogon test]# echo ${a%lx} #从右往左最短匹配
[root@bogon test]# echo ${a%%l
x} #从右往左最长匹配

[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值