Shell 编程

Shell 编程

1.什么是shell

shell是一个命令解释器, 将人类输入高级语言, 通过 Shell程序 转换为 二进制

shell分为两种使用方式:

交互: 登录 执行命令 退出
非交互: 执行某个文件, 文件中都是一推命令, 整个文件从上往下依次执行

2.什么是shell 脚本

(1) 将系统命令堆积在一起,顺序执行(简称: 系统命令堆积
(2) 特定的格式 + 特定的语法 + 系统的命令 = 文件

3.shell 脚本能做什么

标准:
	1.安装方式一致
	2.安装路径一致
	3.目录结构一致
	4.日志格式一致
	5.脚本路径一致
    6.能将平时操作脚本化,流程化,自动化     ITIL 
	ppt   人  流程   技术/工具
备份
监控
自动化上线
约束标准

4.shell 脚本书写规范

执行方式分为两种:

1.加执行权限 ./script_filename.sh
2.通过bash直接翻译 bash script_filename.sh

问题: #!/usr/bin/bash  加与不加区别在哪?
 	 1.如果你明确清楚这是一个什么类型的脚本,直接调用对应的解释器执行,没有影响?
	 2.如果你不清楚是什么类型的脚本, 直接使用./执行,那么会读取该脚本的第一行
	 如果第一行是#!/usr/bin/bash 或者 没有写该行,那么都将使用默认的bash翻译
问题: 如果我是一个python脚本,没有写开头,那么执行一定会报错
	  因为默认查找的是bash解释器,而我的文件需要用python解释器来翻译.

添加命令解释器的几种方式:
	#!/usr/bin/bash
	#!/usr/bin/sh
	#!/usr/bin/env bash
	#!/usr/bin/env python

5.什么是变量

变量是shell中传递数据的一种方法。
简单理解: 就是用一个固定的字符串去表示不固定的值,便于后续引用。

6.定义变量的规范

1.大写开头,后面小写或数字都ok
2.变量具体一定的含义
3.注意 变量的写法 仅支持 a=1 不支持 a = 1

7. 自定义变量

var="hello world"
echo $var
echo ${var}_log

8.$* 和 $@ 的区别?

可以看到不加引号时,二者都是返回传入的参数,但加了引号后,此时\(*把参数作为一个字符串整体(单字符串)返回,\)@把每个参数作为一个字符串返回

9.需求1:通过位置传参方式, 创建 Linux 系统账户及密码,执行 var1.sh username password

[root@ansible /scripts/User]# cat var01.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var01.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
useradd $1
echo "$2"|passwd --stdin $1

[root@ansible /scripts/User]sh var01.sh old3 1234

10.需求2:通过位置传参方式, Linux 系统账户及密码,执行 var1.sh username password,控制最多传递两个参数。

[root@ansible /scripts/User]# cat var02.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var02.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
if [ $# -ne 2 ];then
	echo "USAGE: $0 请传递两个参数[username|password]"     exit
fi
useradd $1
echo $2|passwd --stdin $1


[root@ansible /scripts/User]# sh var02.sh  oldxu4 12345

read

需求1:使用read模拟Linux登陆页面。

[root@ansible /scripts/User]# cat var03.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var03.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
echo "$(hostnamectl |awk -F ":" '/Operating System:/ {print $2}')"
echo "Kernel $(uname -r) on an $(uname -m)"
read -p "$(hostname) Login: " acc
read -s -t50 -p "Password: " pw
echo ""
echo "你输入的用户名: $acc	你输入的密码是: $pw"

[root@ansible /scripts/User]# sh var03.sh 

需求2:使用 read编写一个备份脚本,需要用户传递2个参数,源和目标。

[root@ansible /scripts/User]# cat var04.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var04.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
echo "--------按照提示进行操作-------------"
read -p "请输入你要备份的源文件或者源目录: " Source
read -p "请输入你要备份的目录位置是哪里: " Dest
echo -e "\t你要输入的源文件为 $Source"
echo -e "\t你要输入的目标文件为 $Dest"
read -p "你确定要拷贝吗?[y|n]" action
if [ $action == y  ];then
cp -rp $Source $Dest
fi

[root@ansible /scripts/User]# sh var04.sh 

需求3:使用read编写一个探测主机存活脚本,需要用户传递测试的IP地址。

1.提示用户输入IP地址
2.对用户输入的IP地址进行探测是否存活
3.判断探测结果是否成功
成功则输出成功的结果
失败则输出失败的结果


[root@ansible /scripts/User]# cat  var05.sh
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var05.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
echo "-------按照提示进行操作----------"
read -p "请输入你的ip地址" ip
ping -W1 -c1 $ip  &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is ok"
else
echo "$ip is error"
fi

[root@ansible /scripts/User]# sh var05.sh
-------按照提示进行操作----------
请输入你的ip地址10.0.0.51
10.0.0.51 is error

需求4:使用read编写一个修改系统主机名称脚本。

1.打印当前的主机名称
2.提示用户输入新的主机名称
3.询问用户是否修改?
4.确定修改,执行修改命令
5.不确定修改,退出脚本

[root@ansible /scripts/User]# cat var06.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var06.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
echo "---------按照提示进行操作----------"
echo "当前的主机名为$(hostname)"
read -p "将主机名要修改为 $new_host" new_host
read -p "是否修改主机名[y|n]" action
if [ $action == y ];then
hostnamectl set-hostname $new_host
echo "你的主机名已经修改为 $new_host"
fi

[root@ansible /scripts/User]# sh var06.sh 
---------按照提示进行操作----------
当前的主机名为ansbile
将主机名要修改为 ansible
是否修改主机名[y|n]y
你的主机名已经修改为 ansible

变量替换

[root@manager ~]# url=www.sina.com.cn
[root@manager ~]# echo $url
www.sina.com.cn
[root@manager ~]# echo $url | awk -F '.' '{print $2,$3,$4}'
sina com cn
[root@manager ~]# echo ${url}
www.sina.com.cn

------------#
[root@manager ~]# echo ${url#*.}		#从头开始匹配,最短匹配
sina.com.cn 
[root@manager ~]# echo ${url##*.}		#从头开始匹配,最长匹配
cn

------------%
[root@manager ~]# echo ${url%.*}
www.sina.com
[root@manager ~]# echo ${url%%.*}
www

-------------/
[root@manager ~]# echo ${url/c/C}
www.sina.Com.cn
[root@manager ~]# echo ${url//c/C}
www.sina.Com.Cn

需求1:如何替换 $PATH 中的/bin/替换为/BIN/

[root@ansible /scripts/User]# echo "${PATH//bin/BIN}"

需求2:变量string="Bigdata process is Hadoop, Hadoop is open source project",执行脚本后,打印输出string变量,并给出用户以下选项:

(1)、打印string长度
(2)、删除字符串中所有的Hadoop
(3)、替换第一个Hadoop为Linux
(4)、替换全部Hadoop为Linux
用户输入数字1|2|3|4,可以执行对应项的功能

[root@ansible /scripts/User]# cat var07.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var07.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
string="Bigdata process is Hadoop, Hadoop is open source project"
echo "(1)、打印string长度"
echo "(2)、删除字符串中所有的Hadoop"
echo "(3)、替换第一个Hadoop为Linux"
echo "(4)、替换全部Hadoop为Linux"
echo "用户输入数字1|2|3|4,可以执行对应项的功能"
read -p "请输入数字" number
if [ $number -eq 1 ];then
echo "它的长度为 ${#string}"
fi
if [ $number -eq 2 ];then
echo "${string//Hadoop/}"
fi
if [ $number -eq 3 ];then
echo "${string/Hadoop/Linux}"
fi
if [ $number -eq 4 ];then
echo "${string//Hadoop/Linux}"
fi

sh var07.sh 
(1)、打印string长度
(2)、删除字符串中所有的Hadoop
(3)、替换第一个Hadoop为Linux
(4)、替换全部Hadoop为Linux
用户输入数字1|2|3|4,可以执行对应项的功能

需求3:查看内存/当前使用状态,如果使用率超过80%则报警发邮件,思路如下:

1.当前内存使用百分比是多少
2.进行判断比对
如果大于80% 则触发邮件
否则,over
已使用的内存 / 总内存 * 100 = 使用的百分比

[root@ansible /scripts/User]# vim var08.sh

  1 #!/bin/bash
  2 #*****************************************
  3 #name:      baozexu
  4 #QQ:       2897374243
  5 #Date:     2019-10-28
  6 #FileName: var08.sh
  7 #URL:      https://www.baozexu.com
  8 #Description: 
  9 #*****************************************
 10 mem_free=$(free -m|awk 'NR==2{print $3/$2*100}')
 11 echo "当前内存的百分比为${mem_free}"
 12 if [ ${mem_free%.*} -ge 5 ];then
 13 echo "你的内存已超标 目前的状态是$mem_free"
 14 fi
 
[root@ansible /scripts/User]# sh var08.sh 
当前内存的百分比为12.963
你的内存已超标 目前的状态是12.963

需求4:根据系统时间,打印今年和明年时间。

[root@ansible /scripts/User]# cat var09.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var09.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
echo "今年的时间为$(date +%Y)"
echo "明年的时间为$(($(date +%Y)+1))"

[root@ansible /scripts/User]# sh var09.sh 
今年的时间为2019
明年的时间为2020

需求5:根据系统时间获取今年还剩下多少星期,已经过了多少星期。思路如下:

date +%j 已经过了多少天

一年有365天 已经过了 301 = 还剩下 365-301 = 64 / 7 = 还剩下多少周
已经过了 301 天 / 7 = 已经过了多少周

[root@ansible /scripts/User]# cat var010.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var010.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
Date=$(date +%j)
echo "已经过了 ${Date}天"
echo "已经过了$(( ${Date}/7))周"
echo "还剩下$[ (365-${Date})/7]周"


[root@ansible /scripts/User]# sh var010.sh 
已经过了 301天
已经过了43周
还剩下9周

需求3:完成一个计算器功能: 传入2个值,然后对传入的值进行 加 减 乘 除,思路如下:

1.使用read让用户传值: $1 $2
2.对传入的值进行运算:
3.输出对应的结果.

[root@ansible /scripts/User]# cat var011.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var011.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
echo "欢迎使用计算机"
read -p "请输入你的值 " number
read -p "请输入你的值 " num
echo "$number+$num=$((number+num))"
echo "$number-$num=$((number-num))"
echo "$number*$num=$((number*num))"
echo "$number/$num=$((number/num))"



[root@ansible /scripts/User]# sh var011.sh 
欢迎使用计算机
请输入你的值 1
请输入你的值 2
1+2=3
1-2=-1
1*2=2
1/2=0

需求4:使用Shell脚本打印,系统版本、内核版本平台、虚拟平台、静态主机名、eth0网卡IP地址、lo网卡IP地址、当前主机的外网IP地址curl icanhazip.com

[root@ansible /scripts/User]# cat var012.sh 
#!/bin/bash
#*****************************************
#name:      baozexu
#QQ:       2897374243
#Date:     2019-10-28
#FileName: var012.sh
#URL:      https://www.baozexu.com
#Description: 
#*****************************************
Centos=$(hostnamectl|awk -F ": " 'NR==7{print $2}')
Kernel=$(hostnamectl|awk -F ": " 'NR==9{print $2}')
Hostname=$(hostname)
ip=$(ip a|grep lo|awk 'NR==3{print $2}')
echo "系统版本为: ${Centos}"
echo "内核为: ${Kernel}"
echo "主机名为: ${Hostname}"
echo "lo网卡地址为: ${ip}"


[root@ansible /scripts/User]# sh var012.sh 
系统版本为: CentOS Linux 7 (Core)
内核为: Linux 3.10.0-957.el7.x86_64
主机名为: ansible
lo网卡地址为: 127.0.0.1/8
posted @ 2019-10-28 20:42  爱可耐  阅读(250)  评论(0编辑  收藏  举报