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 @   kirin(麒麟)  阅读(136)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
Δ
点击右上角即可分享
微信分享提示