1、Shell 基本概述

版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者:kirin

1、Shell基本概述

1.什么是shell

shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,将用户输入的命令翻译给操作系统,并将处理的结果输出至屏幕。

当然shell命令是存在 交互式、非交互式两种方式。way?
其实是我们日常使用最多的一种模式、登录终端、执行命令、 返回结果。再次输入命
令然后等待结果。最后结束工作退出Shell会话。当退出Shel/会话后 ,当前的shell会
话也就终止了。
那什么又是shell非交互式:在这种模式下, shel/不与你进行交互,而是直接读取某个
文件进行执行。那文件中都有什么, "其实就是一堆的命令”。 当该文件丛头执行到
尾,结束后,当shell也就终止了。

2.什么是shell脚本

2.1.将系统命令堆积在一起,顺序执行简称系统命令堆积

示例:
[root@test ~]# vim test.sh 
[root@test ~]# sh -x test.sh   ##(-x参数是显示脚本执行的过程)
+ pwd
/root
+ ls
test.sh
+ ll
test.sh: line 3: ll: command not found
+ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

2.2.特定的格式+特定的语法+系统的命令=文件。

1.申明我们是一个shell脚本
2.if for 
3.command  { ls | pwd | awk | sed }

2、Shell脚本能做什么

shell脚本能做什么(shell其实就是基于标准化之上的>脚本工具
1、基础配置系统初始化操作、系统更新、 内核调整、网络、时区、SSH优化
2、安装程序部署LNMP、LNMT、 MySQL、Nginx、 Redis、 ELK等等
3、配置变更Nginx Conf、PHP Conf、MySQL Conf、Redis Conf
4、业务部署Shel/配台git、jenkins实现自动化部署php、java代码,以及代码回滚
5、日常备份:使用ShelI脚本对MySQL进行每晚的全备与增量备份
6、信息采集Zabbix+Shel/,硬件、系统、服务、网络、等等
7、日志分析取值>排序>去重>统计>分析
8、服务打扩容打容监控服务器集群pu,如cpu负载持续80% +触发动作脚本,脚本
调用api开通云主机>初始化环境>加入集群>对外提供
9、服务缩容监控服务器集群pu使用率, -> 低于20%->检测当前有多少web节点>判断
是否超过预设>缩减到对应的预设状态>变更负载的配置

PS:注意Shell脚本主要的作用是简化操作步骤提高效率,减少人为干预,减少系统故障

3、Shell脚本预备知识

1.学习shelI脚本需要的预备知识

1、熟练使用vim编辑器
2、熟练使用inux 基础命令
3、 熟练使用linux三剑客

PS:注意如果我们对命令使用不够熟练、对基本服务也不会手动搭建、那么一定学不会Shell

2.如何才能学好shelI脚本

1、基础命令+基础服务+练习+思路。(必备)
2、能看懂Shell脚本—> 能修改Shell脚本—>能编写Shell脚本—>能优化ShelI脚本
shell需要基础:
1、基础命令 { awk | sed | find | grep | ps | netstat | useradd | ..... } + 基础服务 +  练习 + 思路。  (必备)

需求:获取nginx7中状态的指标:

1.如何打印nginx7中状态
1.1)安装nginx .
1.2)开启状态模块

2.如何提取状态中的值
2.1) curl获取到结 果
2.2)使用awk提取具体的值

Active Connection: 1
-------------------------------------------------------------------------------

2、能看懂Shell脚本->能修改Shell脚本-->能编写Shell脚本-->能优化Shell脚本
-------------------------------------------------------------------------------

1.基础配置:		yum源  ssh   软件包  创建用户  内核参数 ......		{ shell | ansible }
2.配置变更:     Nginx  PHP   Tomcat  MySQL                  { shell  |  ansible }
3.部署代码:     Gitlab     Jenkins    shell|ansible   web集群     { shell  |  ansible }
4.监控服务:     Zabbix  ...............								  { shell }
5.日志分析:     pv uv  ip	{ awk }		    elkstack
6.自动扩容:     监控系统+       弹性伸缩服务(免费)             { shell  |  Python }
7.自动缩容:
8.日常备份:		Shell  \    rsync  							  { shell } 



4、shell脚本书写格式

1.shell脚本命名:

名字要有意义,不要使用a、b、c、1、2、3、这种方式命名,虽然inux系统中,文件没有打展名的概念,依然建议你用.sh结尾,名字不要太长,最好能在30个字节以内解决。例如: check _memory.sh

示例:

比如我们创建了两个文件。一个是1.py,另一个是1.sh。那么以py结尾的一定是Pytho件?1.sh一定是脚本文件吗?并不是!具体是什么文件可以用file命令查看

2.shell脚本格式:

shell脚本开头必须指定脚本运行环境以# ! 这个特殊符号组台来组成。如:

!/bin/bash指定该脚本是运行解析由/bin/bash来完成的。

3.实现编写.sh结尾文件时自动添加开头

[root@test ~]# vim /root/.vimrc
[root@test ~]# cat /root/.vimrc
autocmd BufNewFile *.sh exec ":call AddTitleForShell()"
function  AddTitleForShell()
    call append(0,"#!/bin/bash")
    call append(1,"# **********************************************************")
    call append(2,"# * Author        : oldzhang")
    call append(3,"# * Email         : 1224256589@qq.com")
    call append(4,"# * Create time   : ".strftime("%Y-%m-%d %H:%M"))
    call append(5,"# * Filename      : ".expand("%:t"))
    call append(6,"# * Description   : xxxxxx")
    call append(7,"# **********************************************************")
endfunction
##当我们编写.sh结尾的文件时会自动添加开头
[root@test ~]# vim test.sh
[root@test ~]# cat test.sh
#!/bin/bash
# **********************************************************
# * Author        : oldzhang
# * Email         : 1224256589@qq.com
# * Create time   : 2021-06-21 07:16
# * Filename      : test.sh
# * Description   : xxxxxx
# **********************************************************
ls
[root@test ~]# sh test.sh -x
1.py  1.sh  2.txt  file.txt  test.sh  user.txt	user.txtn

5、shell执行方式

bash /check.sh 直接使用bash解释器去翻译这个文件中的内容
/check.sh 必须要有执行权限 ( #!/bin/bash ) 默认是bash

演示:

编辑一个test1.sh的文件
[root@test ~]# vim test1.sh

把#!bin/bash这一行去掉

接下来分别用bash和./来运行

[root@test ~]# bash test1.sh 
[root@test ~]# ./test1.sh 

上面它提示权限不足。好,那我们就赋予它执行权限
[root@test ~]# chmod =x test1.sh 
[root@test ~]# ./test1.sh 

可以执行,是因为脚本文件中不加开头的话,默认就是bash运行,如果我们改个开头呢?
这里我们以Python为例
[root@test ~]# vim test1.sh 
[root@test ~]# cat test1.sh
#!/usr/bin/env python
# **********************************************************
# * Author        : oldzhang
# * Email         : 1224256589@qq.com
# * Create time   : 2021-06-21 07:29
# * Filename      : test1.sh
# * Description   : xxxxxx
# **********************************************************


echo "123"

#接下来我们用./来执行一下
[root@test ~]# ./test1.sh 

6、shell变量

@ 1.什么是变量

变量是shell中传递数据的一种方法。

简单理解就是用一个固定的字符串去表示不固定的值,便于后续引用。

-----------------------------------------------------------------------------

@ 2.变量命名的书写规范

不允许:
1、数字开头
2、特殊字符开头
3、不能与系统命令冲突
允许:
1、开头最好是大写
2、最好是一个好记忆的名称
3、比如说我们想取出系统负载值
Load_ava_1 = $()
Load_Ava_5 = 
Load_Ava_15 = 
Path = /backup

3.变量定义的几种方式:

3.1.用户自定义变量:人为定义变量名与变量的值。
例如: Load_ava_1 = $()
等号代表的是一个赋值的操作,等号的两边不能有空格
3.2.系统环境变量:保存的是和系统操作环境相关的数据,所有用户都可以使用。
例如:
需求: 脚本只能是root运行,非root拒绝运行
解决:
3.2.1.判断当前用户的uid是否为1 ,如果是 则运行, 如果不是0 则拒绝
if [ $UID -ne 0 ];then
echo "请切换到root身份运行此脚本"
	  exit
fi
			
echo "Done....."
3.2.2.判断当前用户是否为root,   如果是 则运行,如果不是root 则拒绝
if [ $USER != "root" ];then
	echo "请切换到root身份运行此脚本"
	exit
fi
			
echo "Done....."

4.位置参数变量:向脚本中进行参数传递(传参),变量名不能自定义,变量作用是固定的。

脚本内容

[root@oldzhang~]# cat test.sh
#!/bin/bash
echo "#当前she11 脚本的文件名: $0"
echo "#第1个she11 脚本位置参数: $1"
echo "#第2个she11脚本位置参数: $2"
echo "#第3个she11 脚本位置参数: $3"
echo "#所有传递的位置参数是: $*" 
echo "#所有传递的位置参数是: $@"
echo "#总共传递的参数个数是: $#"
echo "#当前程序运行的PID是: $$"
echo “#表示上一个在后台运行的脚本的PID是:$! “
echo "#上一个命令执行的返回结果: $?"

4.1.使用场景
需求1:通过位置变量创建 Linux 系统账户及密码,执行 var1.sh username password
[root@m01-shell /server/scripts]# cat userpasswd.sh 
#!bin/bash
useradd $1
echo "$2" | passwd --stdin $1


需求2:通过位置变量创建 Linux 系统账户及密码,执行 var1.sh username password,控制最多传递两个参数
[root@m01-shell /server/scripts]# cat userpd.sh 
#1.判断传递的参数是否为2,如果不是,则提示该脚本如何使用:
if [ $# -ne 2 ];then
   echo "USAGE: $0 { Username  && Password }"
   exit
fi

#2.如果符合条件,则会执行后续的创建操作
useradd $1
echo "$2" | passwd --stdin $1


需求3: 继需求2, 继续实现,脚本只能是root运行,非root拒绝运行:

分析:

借助系统的环境变量,来做判断:

USER: 用户名称的比对

UID: 用户的ID比对

条件:

如果UID为0,则运行脚本,否则拒绝运行

[root@m01-shell /server/scripts]# cat userpwd.sh
#1.由于创建用户只能是root运行,所以判断执行者的身份
if [ $UID -ne 0 ];then		# 如果UID不等于0  -ne 不等于的意思
   echo "Please su - SuperMan Admin...."
   exit
fi

#2.判断传递的参数是否为2,如果不是,则提示该脚本如何使用:
if [ $# -ne 2 ];then
   echo "USAGE: $0 { Username  && Password }"
   exit
fi

#3.如果符合条件,则会执行后续的创建操作
useradd $1
echo "$2" | passwd --stdin $1
需求4: 做一个备份场景: 会传递两个参数: { 一个是源文件 一个是目标位置 } , 控制必须是两个,不可以是三个:

分析:

1.控制仅传递两个参数: $#

1.1) 两个参数: 继续往下执行

1.2) 超过两个参数: 提示脚本应该如何使用

2.执行备份操作:

cp -rp 源 目标

[root@m01-shell /server/scripts]# cat backup.sh 
#1.判断传递的参数:
if [ $# -ne 2 ];then
   echo "USAGE: $0 { Source_File | Dest_File }"
   exit
fi

# 2.执行拷贝动作
cp -rpv $1 $2

7、变量赋值

1.变量赋值的方式read?

除了自定义变量,以及系统内置变量,还可以使用read命令通过交互式方式传递变

量。

read选项 选项含义
-p 打印信息
-t 限定时间
-s 不回显(不显示明文信息)
-n 指定字符个数
需求1:使用 read编写一个备份脚本,需要用户传递2个参数,源和目标。
[root@m01-shell /server/scripts]# cat read1.sh 
#!/bin/bash
read -p "请输入需要备份的目录或文件: " sourc
read -p "请输入目标地址: " dest

echo "你要备份的是: " $sourc
read -p "你确定要将 ${sourc} 被分到 ${dest} 吗? [ Y | N ]: " Action

if [ $Action == "Y" ];then
   cp -rp ${sourc} ${dest}

echo "备份完成"
fi

需求2:使用read模拟Linux登陆页面
[root@m01-shell /server/scripts]# vim login.sh
[root@m01-shell /server/scripts]# cat login.sh
#!/bin/bash
hostnamectl  | awk -F ':' '/Operating/{ print $2 }'
hostnamectl  | awk '/Kernel/' | awk -F '[ :]+' '{ print $2,$4}'
uname -m

Oprating=$(hostnamectl  | awk -F ': ' '/Operating/{ print $2 }')
Kernel=$(hostnamectl  | awk '/Kernel/' | awk -F '[ :]+' '{ print $2,$4}')
Hostname=$(hostname)

echo "$Oprating"
echo "$Kernel on an $(uname -m)"
echo ""

read -p "$Hostname Login: " User
read -s -p "Password: " Pass
echo ""


if [ $User == "root" -a $Pass == "123" ];then
	echo "欢迎 Root 归队..."
else
	echo "用户或者密码错误...."
fi

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

分析:

​ ping -c1 10.0.0.1

​ 0: 成功

​ 1: 失败

[root@m01-shell /server/scripts]# cat testip.sh 
#!/bin/bash
read -p "请输入你要探测的主机IP地址: " Ip

ping -c1 -W1 $Ip &>/dev/null
if [ $? -eq 0 ];then
	echo -e "\033[32m $Ip 通... \033[0m"
else
	echo -e "\033[31m $Ip 不通... \033[0m"
fi

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

​ 分析:

​ 1.打印下当前的主机名称是什么?

​ 2.询问你要修改后的主机名称是什么?

​ 3.确认一下: 是否要真的修改?

​ 是:

​ 调用hostnamectl命令修改

​ 否:

[root@m01-shell /server/scripts]# vim name.sh
[root@m01-shell /server/scripts]# cat name.sh
#!/bin/bash
Old_Hostname=$(hostname)
echo "当前的主机名称是 ${Old_Hostname}"
read -p "你要修改的主机名称是: " New_Hostname
read -p "你确定要将 ${Old_Hostname} 修改为 ${New_Hostname} 吗? [ Y | N ]: " Action

if [ $Action == "Y" ];then
	hostnamectl set-hostname ${New_Hostname}
fi

8、shell变量替换

1.什么是变量替换?

简单来说,就是在不改变原有变量的情况下,对变量进行替换。

2.为什么要用变量替换?

比如:我们需要对某个变量的值进行整数比对,但变量的值是一个小数。 怎么办?我们

可以使用变量替换的方式,将小数位进行删除,然后在进行整数比对。

3.变量替换的几种方式:

变量 说明
$ 从头开始匹配,最短删除
$ 从头开始匹配,最长删除
$ 从尾开始匹配,最短删除
$ 从尾开始匹配,最长删除
$ 替换变量内的旧字符串为新字符串,只替换第一个
$ 替换变量内的旧字符串为新字符串,全部替换
演示:
url=www.sina.com.cn

[root@mananger variables]# echo ${url#*.}
sina.com.cn
[root@mananger variables]# echo ${url##*.}
cn
[root@mananger variables]# echo ${url%.*}
www.sina.com
[root@mananger variables]# echo ${url%%.*}
www
需求:查看内存/当前使用状态,如果使用率超过80%则报警发邮件:

​ 分析:

​ 1.内存怎么看? free -m

​ 2.如何提取百分比

​ 3.如果有小数,需要变量替换

[root@m01-shell /server/scripts]# vim neicun.sh
[root@m01-shell /server/scripts]# cat neicun.sh
#!/bin/bash
free_use=$(free -m | awk '/^Mem/ {print $3/$2*100}')

if [ ${free_use%.*} -eq 80 ];then
	echo "发邮件..."
	echo "内存已经超过了百分之80,目前的内存使用率是 ${free_use}%"
else
	echo "没有超过80% 正常状态"
	echo "目前内存已经使用 ${free_use}%"
fi

需求: centos6.7 系统,centos7 的系统, 安装yum源:

​ 分析:

​ 1.获取当前系统的版本 6.7 7

​ 2.判断比对

​ 如果为6: 则安装6的源

​ 如果为7: 则安装7的源

[root@m01-shell /server/scripts]# cat yum2.sh 
#!/bin/bash
os_relase_version=$(awk '{print $(NF-1)}' /etc/redhat-release)
if [ ${os_relase_version%%.*} -eq 7 ];then
	wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
fi

if [ ${os_relase_version%%.*} -eq 6 ];then
	wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
fi

基于上面的需求在完善一下:
[root@m01-shell /server/scripts]# vim yum2.sh 
[root@m01-shell /server/scripts]# cat yum2.sh 
#!/bin/bash
#centos6和centos7获取当前文件中的列不同
os_ver=`cat /etc/redhat-release |awk '{print $(NF-1)}'`
if [ ${os_ver%%.*} -eq 7 ]
then
    ping -c2 -W1 114.114.114.114 &>/dev/null
    if [ $? -ne 0 ];then
       echo "网络不通正在重启网络请稍后......"
       systemctl restart network
           ping -c2 -W1 114.114.114.114 &>/dev/null
	   [ $? -ne 0 ] && echo "sendmail......管理员请尽快检查服务器的网络"
    fi
    if  [ `rpm -qa wget|wc -l` -eq 0 ];then
        yum -y install wget &>/dev/null
        if  [ $? -eq 0 ];then
	    echo "wget 安装成功......."
        else
            echo "安装失败 检查网络或YUM源....."
 	fi
    fi
    wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null
    if [ $? -eq 0 ];then
       echo "YUM源更新成功"
    else
       echo "YUM源更新不成功 可能是由于网络引起"
    fi
elif [ ${os_ver%%.*} -eq 6 ]
then
    wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
else
    echo "请检查您的系统版本"
        if [ $? -eq 0 ];then
       echo "YUM源更新成功"
    else
       echo "YUM源更新不成功 可能是由于网络引起"
    fi
fi

需求:二级菜单

PHP MySQL Redis Nginx 每个服务有不同的版本

[root@m01-shell /server/scripts]# vim yum3.sh
[root@m01-shell /server/scripts]# cat yum3.sh
#!/bin/bash
while true
do
echo "------------------------------SERVER安装列表-----------------------------"
echo "|				1.INSTALL PHP		  		 |"
echo "|				2.INSTALL MySQL			   	 |"
echo "|				3.INSTALL Redis				 |"
echo "|				4.INSTALL Nginx				 |"
echo "|				5.退出当前脚本				 |"
echo "------------------------------SERVER安装列表-----------------------------"
read -p "请输入你要安装服务的编号或者服务名称:[1|PHP|2|MySQL] " num
if [ "$num" = "1" -o $num = "PHP" ];then
	echo "------------------------------PHP安装列表-----------------------------"
	echo "|                         1.INSTALL PHP5.1                          |"
	echo "|                         2.INSTALL PHP5.2                          |"
	echo "|                         3.INSTALL PHP5.3                          |"
	echo "|                         4.INSTALL PHP5.4                          |"
	echo "------------------------------PHP安装列表-----------------------------"
    read -p "请输入你要安装服务的编号或者版本号:[1|PHP|2|MySQL] " num1
        if [ "$num1" = "1" -o "$num1" = "PHP5.1" ];then
           echo "安装YUM源......."
	   sleep 2
           echo "PHP5.1安装成功"
        elif [ "$num1" = "2" -o "$num1" = "PHP5.2" ];then
           echo "安装YUM源......."
           sleep 2
           echo "PHP5.2安装成功"
        fi
elif [ "$num" = "2" -o $num = "MySQL" ];then
        echo "------------------------------MySQL安装列表-----------------------------"
        echo "|                         1.INSTALL MySQL5.4                          |"
        echo "|                         2.INSTALL MySQL8.0                          |"
        echo "|                         3.INSTALL MySQL8.1                          |"
        echo "|                         4.INSTALL MySQL8.2                          |"
        echo "------------------------------MySQL安装列表-----------------------------"
	    read -p "请输入你要安装服务的编号或者版本号:[1|PHP|2|MySQL] " num2
        if [ "$num2" = "1" -o "$num2" = "MySQL5.4" ];then
           echo "安装YUM源......."
           sleep 2
           echo "MySQL5.4安装成功"
        elif [ "$num2" = "2" -o "$num2" = "MySQL5.5" ];then
           echo "安装YUM源......."
           sleep 2
           echo "MySQL5.5安装成功"
        fi
elif [ "$num" = "5" ];then
    echo "欢迎下次再来再见!!!"
    exit
fi
done

需求:写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比语塞数字大或者小
[root@m01-shell /server/scripts]# cat caishuzi.sh 
#!/bin/bash
num=`echo $((RANDOM%100+1))`

i=1

#输入一个数值($num1)

read -p "请输入一个整数:" num1

#while循环

while true;do

#使用$num1和$num比较

if [ $num1 -gt $num ];then

echo "这个数字太大了啊!"

read -p "请输入一个整数:" num1

elif [ $num1 -lt $num ];then

echo "您输入的数字太小。"

#当$num1不等于$num的时候,提示用户重新输入$num1

read -p "请输入一个整数:" num1

else

#当输入的$num1和$num相同时,输出"You WIN"

echo "恭喜您答对了!"

break

fi

#依次递增,当$num1和$num不相等时继续循环

let i++

done

#输出你总共输出了多少($i)次

echo "您总数输入了 $i 次"

9、变量的整数运算

1.什么是变量运算?

其实就是我们以前学习过的加减乘除。

2.为什么要学习变量运算?

比如:当我们需要开发一个计算器的时候是不是就需要运算了?

3.变量运算使用什:么方式来实现?

通常整数运算有‘expr. $((). $[]等方式,小数运算有bc、awk方式。

操作符 含义
num1+num2
num1-num2
num1*num2
num1/num2
num1%num2
需求:编写一个shell计算器
[root@m01-shell /server/scripts]# vim jisuanqi.sh 
[root@m01-shell /server/scripts]# cat jisuanqi.sh 
#!/bin/bash
# 功能介绍
function echo_info() {
echo " ----------------------------------" 
echo "|这是一个简单的整数计算器,biubiu |" 
echo " ----------------------------------" 
echo
}

# 接受参数
function accept_data(){
    read -p "请输入第$1 个整数:" num
    expr $num + 0 &> /dev/null
    if [ $? -eq 0 ];then
        return 0
    else
        return 1
    fi
}

# 接受输入的操作
function operation(){
echo "-------------------" 
echo "| 1.加法 |" 
echo "| 2.减法 |" 
echo "| 3.乘法 |" 
echo "| 4.除法 |" 
echo "-------------------" 
read -p "请输入您想执行的操作:" choice
expr $choice + 0 &> /dev/null
if [ $? -eq 0  ];then
    if [ $choice -lt 5 -a $choice -ge 1 ];then
        return $choice
    else
        echo "输入超出范围"
    fi
else
    echo "非法输入"
fi
}


function func_menu(){
echo -e "继续:1 \n退出 2"
read -p '输入选项:' inp_num
if [ $inp_num -eq 1 ];then
    return 1
elif [ $inp_num -eq 2 ];then
    return 2
else
    return 3
fi
}

function judge(){
declare -A match=([1]="+" [2]="-" [3]='*' [4]="/")
for i in ${!match[*]}
do
    if [ $i -eq $3 ];then
       res=`echo  "$1 ${match[$i]} $2" | bc `
       echo "$1 ${match[$i]} $2 = $res"
    fi
done
}

function main(){
while true
do
    echo_info
    accept_data 1
    if [ $? -eq 0 ];then
        num_1=$num
        accept_data 2
        if [ $? -eq 0 ];then
            num_2=$num
        else
            echo "必须输入整数!"
            continue
        fi
    else
        echo "必须输入整数!"
        continue
    fi
    operation
    judge $num_1 $num_2 $?
    func_menu
    flag=$?
    if [ $flag -eq 2 ];then
        break
    elif [ $flag -eq 3 ];then
        echo '非法操作'
        func_menu
    elif [ $flag -eq 1 ];then
        echo '再次计算 !'     
    fi

done
}

main

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

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

​ 分析:

​ 1.打印系统时间: date

​ 2.date + 1 = 明年

[root@m01-shell /server/scripts]#  echo "今年是 $(date +%Y) , 明年是 $[ $(date +%Y) + 1 ]"
今年是 2021 , 明年是 2022

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

​ 分析:

​ 1.计算下从年初到现在已经过了多少天 ( date +%j )

​ \2. 天数 / 7 --> 过了多少周

​ \3. ( 365 - 天数 ) / 7 --> 还剩下多少周

[root@m01-shell /server/scripts]# vim time.sh 
[root@m01-shell /server/scripts]# cat time.sh
#!/bin/bash
Day=$(date +%j)
echo "从年初到现在已经过了多少天 $Day"
echo "距离新年还剩下多少天: $[ 366 - ${Day} ]"
echo "从年初到现在已经过了多少周: $[ ${Day} / 7 ]"
echo "距离新年还有多少周: $[ (366 - ${Day}) / 7 ]"

posted @ 2022-04-12 21:41  kirin(麒麟)  阅读(207)  评论(1)    收藏  举报
Δ