.sh 后缀结尾的文件为shell脚本(我们一般这么称的)
执行脚本要给脚本加权限
0
0
在路径中加上个软链接
 
脚本的执行方式
用路径(绝对路径)加脚本名
0
 
脚本首先得定义解释器
#!/bin/bash
执行脚本的时候会自己生成1个bash,比如脚本是cd到/opt然后创建文件夹。你本身在根,运行脚本,脚本是独立的到了opt,你不变
0
不加权限可以直接bash 脚本名
 

脚本的执行方式:

1、需要执行权限
使用路径(绝对/相对) + 文件名
2、直接使用shell程序
shell + 文件名
bash + 文件名
sh + 文件名
3、第三种(不要权限) 会影响当前环境,会有未知问题
source(不建议使用) 脚本名
. 等于source
 
# 开头的都是注释,注释可以更好的理解脚本
\n 转行
0
 

脚本的执行逻辑

1、顺序执行:程序按从上到下顺序执行
2、选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
3、循环执行:程序执行过程中需要重复执行多次某段语句
 

脚本错误调试:

1、命令错误
命令出错,不会影响后续的执行
2、语法错误
会影响接下来的命令执行
3、逻辑错误
只能自己去筛查
 
$数字 表示第n个参数
$10 表示第1个参数,得加上{}才行,${10}
查代码的正确
bash -n 脚本名称 (不在当前目录下加绝对路径) 检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径) 逻辑错误
(逻辑错误只能自己去找了)
 

read -p

从键盘输入的内容变成变量
read -p “请输入当前时间:” time
read -p 读取 输入的变成变量
方法1
[root@localhost opt]# read -p “现在的时间是” time
现在的时间是9点
[root@localhost opt]# echo $time
9点
 
方法2
[root@localhost opt]# vim 1.sh
#!/bin/bash
echo -n “请输入你的信息”
read info
echo $info
 
[root@localhost opt]# bash 1.sh
请输入你的信息ky15
ky15
[root@192 ~]# read -p “是否覆盖当前文件 (yes/no)” ACK
是否覆盖当前文件 (yes/no)yes
[root@192 ~]# [ $ACK = “yes” ] && echo “覆盖”
覆盖
[root@192 ~]# read -p “是否覆盖当前文件 (yes/no)” ACK
是否覆盖当前文件 (yes/no)no
[root@192 ~]# [ $ACK = “no” ] && echo “不覆盖”
不覆盖
 

重定向:

重定向:重新定义输出的方向
> 重新定义标准输出
>> 追加,文件下面继续写
& 混合符 前后都一样
1代表 正确输入
2代表 错误输入
& 代表混合
把2导给1,再把1到给lc 2个错误的,1 是正确的结果,等于是1和2都到给了lc,&必不可少
0
0
/dev/zero 空字符
/dev/null 回收站
输入重定向:输入到机器的方向改变
 
 

多行重定向:

首先这个命令得支持标准输入

<<后面的什么 最后结束的时候就输入什么,要一模一样,就可以结束了
0
0
 
不能将正确和错误一起显示出来:
[root@centos7 ~]#ls /data /xxx > /data/all.log 2>&1
[root@centos7 ~]#ls /data /xxx 2> /data/all.log 1>&2
[root@centos7 ~]#ls /data /xxx &> /data/all.log
[root@centos7 ~]#ls /data /xxx >& /data/all.log
[root@centos7 ~]#ls /data /xxx 2>&1 1> /data/all.logv 这个是错误的,上面4个是正确的
 

变量:

常见shell变量的类型包括:
自定义变量:由用户自己定义,修改和使用
环境变量:由系统维护,用于设置工作环境
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改 有些规定好的变量 放在那里让你使用
1、{}定义变量的范围,确定一个变量的长度
2、’ ‘ 在单引号中不识别变量 ,只会看成普通的符号
3、” ” 保留格式,识别变量,并且保留格式
4、` ` 调用命令执行的结果 ` ` =$()
{ pwd;ls; } 和(pwd;ls) 区别是()会打开新的bash

命名规则:

0
1、区分大小写
2、不能使程序中的保留字和内置变量:如:if, for,hostname
3、只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ – ”,和主机名相反
4、不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
5、大驼峰 StudentFirstName
6 、小驼峰 studentFirstName
7、 下划线 student_name
name=’value’
变量名=变量值
直接字串:name=’root’
变量引用:name=”$USER”
命令引用:name=COMMAND 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除
变量引用:
$name
${name}
弱引用和强引用
“$name ” 弱引用,其中的变量引用会被替换为变量值
‘$name ‘ 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
[root@localhost opt]# producet=kgc
[root@localhost opt]# echo $producet
kgc
[root@localhost opt]# version=6.0
[root@localhost opt]# echo $producet$version
kgc6.0
[root@localhost opt]# echo “$producet$version”
kgc6.0
[root@localhost opt]# echo ‘$producet$version’
$producet$version
[root@localhost opt]# echo $producet6.0
.0
[root@localhost opt]# echo ${producet}6.0
kgc6.0
[root@localhost opt]# echo ${producet}$version
kgc6.0
[root@localhost ~]#echo ls
ls
[root@localhost ~]#echo $(ls)
abc.txt anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]#echo ls
abc.txt anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
 
1.赋值时使用双引号(” “)可以直接调用变量
2.赋值时使用单引号(‘ ‘)$只会被认为是字符$ 不会调用变量
3.赋值时使用(“反撇在tab上面)命令替换,提取命令执行后的输出结 果$( ) 用法相同
4.{}可以分隔变量值
 

变量作用范围:

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用
变量取值范围,想改变变量的作用范围
2种:
export 变量名
export 变量名=变量值
可以使用pstree 查看shell的环境
输入bash进入子shell
ctrl+D组合exit 退出子shell
[root@localhost opt]# abc=123
[root@localhost opt]# echo $abc
123
[root@localhost opt]# bash
[root@localhost opt]# echo $abc
为空
[root@localhost opt]# exit
exit
[root@localhost opt]# echo $abc
123
[root@localhost opt]# export abc
[root@localhost opt]# bash
[root@localhost opt]# echo $abc
123
 
定义变量
变量名=值
 
删除变量
unset 变量名
 
追加变量
变量名+=
 
系统变量
变量名+=:值
0

环境变量

  1. 由系统提前创建,用来设置用户的工作环境
  2. 可以使用env查看环境变量
  3. 需要记住的常用环境变量
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径

环境变量:

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
  • 一般只在系统配置文件中使用,在脚本中较少使用
#声明并赋值
export name=VALUE
declare -x name=VALUE
#或者分两步实现
name=VALUE
export name

环境变量的全局配置文件:

配置文件位置在
/etc/profile如果修改此文件会作用于所有用户
~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户
可以用来长期变更或设置环境变量
 

只读变量:

变量值不允许修改(重新赋值)的情况
无法使用 unset删除
最快方法重启
[root@localhost opt]# name=ky15
[root@localhost opt]# readonly name
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# unset name
bash: unset: name: 无法反设定: 只读 variable
#只有退出进程
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# name=ky
bash: name: 只读变量

位置变量:

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
echo “${10}” 位置10
echo “$10” 位置1和0
echo “$*” 将所有项当成一个值
echo “$@” 所有项
echo “$0” 脚本自身
echo “$#” 后面参数的个数

预定义变量:

$# 表示一共多少个参数
$* 当做1个整体给你
$@ 每一个参数当做1个个体给你、
$0 表示当前脚本的名称
$? 表示前一条命令执行后的返回状态,0位执行正确,非0表示异常
$$ 当前进程id

运算:

运算符:
加法 +
减法 –
乘法 \ *
除法 /
取余 (取模)%
 
let
(1) let var=算术表达式
let sum=1+2
sum=1+2
(2) $((var=算术表达式)) 和上面等价
((sum=1+2))
echo $sum
(3) var= $[算术表达式]
(4) var=$((算术表达式))
(5) var=$(expr arg1 arg2 arg3 …)
(6) var= expr arg1 arg2 arg3 …
(7) echo ‘算术表达式’ | bc
$[ ]
$(())
$(expr 1 2 3)
 
expr只能对整数进行运算。bc可以对小数进行运算
0
0
0
 
#i++ 是先赋值给j后再加 ++i是加后再赋值
i++ 是先赋值再加
++i 是加后再赋值
i++ 相当于 i=$[ $i+1 ]
i– 相当于 i=$[ $i – 1 ]
i+=2 相当于 i=$[ $i+2 ]
 
随机数生成器变量:
$RANDOM   取值范围:0-32767
$[RANDOM%33+1]
[root@localhost ~]# echo $[RANDOM%34+1]
9
[root@test1 ~]# vim ji.sh
#!/bin/bash
read -p “请输入第一个整数” num1
read -p “请输入第二个整数” num2
#执行加法运算
sum=expr $num1 + $num2
echo “运算结果为$sum”
[root@test1 ~]# chmod +x ji.sh
[root@test1 ~]# ./ji.sh
请输入第一个整数6
请输入第二个整数9
运算结果为15
 
面试题:
看某个bash的环境变量
先pstree 然后exit退到你要看的环境变量
然后
cat /proc/pid/environ
 
echo
-e 输出转义符
\n 输出转行
 
提取系统信息
#!/bin/bash
cpu=lscpu |grep 型号名称:|cut -d”:” -f2
disk=lsblk |grep disk|tr -s ” “|cut -d” ” -f4
ip=hostname -I|cut -d ” ” -f1
zj=hostname
sv=cat /etc/redhat-release
nh=uname -r
nc=free -h|grep Mem|tr -s ” ” |cut -d ” ” -f2
echo “cpu型号名称:${cpu}”
echo “磁盘大小是:${disk}”
echo “ip地址是:${ip}”
echo “主机名是:${zj}”
echo “系统版本是:${sv}”
echo “内核是:${nh}”
echo “内存是:${nc}”
 
rm -rf 123 是把软连接删了
rm -rf 123/ 是把软连接里面的文件全删除
 

test

格式1:test 条件表达式
格式2:[ 条件表达式 ]
注意[]空格,否则会失败
测试 是否成功使用返回值
[ 操作符 文件或目录 ]
help test
追加1个echo $? 0就是目录
[ ]替代也行
[ -r …. ]这里指实际权限,比如文件无可读,但是因为你是root,自然有有读权限,因此实际返回0
若真,则状态码变量 $? 返回0
若假,则状态码变量 $? 返回1
操作符:
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-a:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
-L: 测试是否为软连接文件
0
 
awk 列处理工具
-F指定分割符 不写默认以空格为分隔符
awl [-F] ‘{print $N}’
$N代指第几列
 

字符串比较

= 等于
!= 不等于
-z 字符串内容为空
-n 字符串是否存在
[ ] 基础模式
[ [ ] ] 加强版。用了这个之后一定要是2个等于号
[ 字符串1 = 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
 
{}和()的区别
()能开启子进程
0
 
逻辑测试
与 都得真 &&
cmd1 && cmd2
或 1个真即真 ||
cmd1 || cmd2
组合:且在前,或在后
否 !表示逻辑否

比较整数数值

-eq:第一个数等于(Equal)第二个数
-ne:第一个数不等于(Not Equal)第二个数
-gt:第一个数大于(Greater Than)第二个数
-lt:第一个数小于(Lesser Than)第二个数
-le:第一个数小于或等于(Lesser or Equal)第二个数
-ge:第一个数大于或等于(Greater or Equal)第二个数
0
 
ping 小脚本
-c 发送包的个数
-i 发送的间隔时间
-W 超时时间
-w 多少秒后停止ping操作
 

IF语句的结构

0
单分支:
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支:
if 判断条件1
then
条件1为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3
then
条件3为真的分支代码
else
以上条件都为假的分支代码
fi
例子:
#!/bin/bash
if [ “$USER” != “root” ]
then
echo “非管理员用户无权限操作”
else
echo “是管理员用户”
fi
 
#!/bin/bash
read -p “请输入你的考试分数:” grade
if [ $grade -ge 85 ]&& [ $grade -le 100 ]
then
echo “你的成绩为$grade”
echo “你的成绩为优秀”
elif [ $grade -ge 70 ]&&[ $grade -le 84 ]
then
echo “你的成绩为$grade”
echo “你的成绩为良好”
elif
[ $grade -ge 60 ]&&[ $grade -le 69 ]
then
echo “你的成绩为$grade”
echo “你的成绩为合格”
else
echo “你的成绩为$grade”
echo “你的成绩不合格”
fi
 

case语句

case支持glob风格的通配符:
*任意长度任意字符
? 任意单个字符
[0-9] 指定范围内的任意单个字符
|   或者,如: a|b
格式:
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
*)
默认分支
;;
read -p “Do you agree(yes/no)? ” INPUT
case $INPUT in
[yY]|[Yy][Ee][Ss])
   echo “You input is YES”
  ;;
[Nn]|[Nn][Oo])
   echo “You input is NO”
  ;;
*)
   echo “Input fales,please input yes or no!”      
esac
 
#!/bin/bash
read -p “请输入你的分数” score
case $score in
100)
echo “$score 你太优秀了”
;;
[89][0-9])
echo “$score 表现不错”
;;
[67][0-9])
echo “$score 你及格了”
;;
[0-9]|[1-5][0-9])
echo “$score 你不及格”
;;
*)
echo “输入有误”
esac
 
 

for循环

知道你要循环几次
0
 
累加:
0
批量创建用户
0
ping
0
批量更改文件名
0
#!/bin/bash
for i in {1..10..2} 2是步长
do
echo $i
done
0
 
for ((i=0;i<=10;i++))
do
sum=$[i+sum]
done
echo $sum
 
[root@localhost ~]# seq -s+ 100|bc
5050
[root@localhost ~]# seq -s+ 1 2 10|bc
25
[root@localhost ~]# seq -s+ 1 2 100|bc
2500
 
九九乘法表
#打印一行*
#!/bin/bash
for i in {1..9}
do
echo -e ” * ”
done
#打印正方形
#!/bin/bash
for j in {1..9}
do
for i in {1..9}
do
echo -e ” * \c”
#\c换行
done
echo
#换行
done
 

while

当命令判断为假时停止
不知道你要循环几次
0
0
 
跳出循环:
exit
continue 跳出本次循环,继续下次循环
break 直接跳出循环 break 2 表示跳出2层循环
 

PS3和select

select
[root@localhost data]#help select
select: select NAME [in 词语 … ;] do 命令; done
从列表中选取词并且执行命令。
 
PS1 提示符
PS2 多行重定向
PS3 菜单选择
#!/bin/bash
sum=0
PS3=”请输入(1-6):”
MENU=”
宫保鸡丁
酸菜鱼
鱼香肉丝
佛跳墙
水煮肉片
点菜结束
[root@localhost ~]#select menu in 配置网卡 配置yum源;do echo $REPLY;done
1)配置网卡
2)配置yum源
 

Shell函数

使用函数可以避免代码重复
使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
 
shell函数定义:
三种:
1、
function 函数名 { 
命令序列
}
2.
函数名(){
命令序列
}
3.
function func_name () {
…函数体…
}
注意事项
  1. 直接写 函数中调用函数 直接写函数名
  2. 同名函数 后一个生效
  3. 调用函数一定要先定义
  4. 只要先定义了调用的 其他函数定义顺序无关
0
0
 
查看函数
declare -F/f
declare -F 看函数列表
declare -f 看函数定义
删除函数
unset func_name
 
返回值
 
函数传参
函数里的变量是全局有效的
0
0
没有local就是全局,有了local就不会
 
0

函数的返回值:

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
使用原则:
  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
  2. 退出码必须是0-255,超出的值将为除以256取余
#!/bin/bash
test1 () {
read -p “请输入一个数字:” num
return $[$num*2]
}
test1
echo $?
怎么解决超过 255
#!/bin/bash
test1 () {
read -p “请输入一个数字:” num
echo $[$num*2]
}
result=test1
echo $result
 
函数调用自己
#!/bin/bash
 
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]
then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
fact $1
总结:
1、定义函数
2、调用函数
注意顺序:
先定义后引用
3、函数文件
建立1个存放函数的独立文件
4、查看函数
declare -F 看函数列表
declare -f 看函数定义
 
函数变量的作用范围:
函数在shell脚本中仅在当前的shell环境中有效
shell脚本中函数的变量默认全局有效
将变量限定在函数内部使用local命令
 

使用函数文件

0
0
0
 
0
 

数组

定义数组:
1、数组名=(value0 value1 value2 value3 ……)
2、数组名=([0]=value [1]=value1 [2]=value2 ….) //可以直接0 2 5 不连续
3、列表名=”value0 value1 value2 value3 …… ”
数组名=($列表名)
0
4、数组名[0]=”value1″
数组名[1]=”value2″
数组名[2]=”value3″
数组的包括数据类型
  • 数值型
  • 字符型
  • 混合型数值加字符
 
a=(1 2 3 4 5)
echo ${a[0]}
#数组的取值 数组加下标
1
[root@localhost ~]# echo ${a[]} //代表所有参数1 2 3 4 5[root@localhost ~]# echo ${a[@]} //@同1 2 3 4 5共有多少个位置[root@localhost ~]# echo ${#a[@]} //前面加#数组的长度5[root@localhost ~]# echo ${#a[]}
5
0

调用数组中的值

调用第一个
echo ${数组名[下标]}
 
a= (10 20 30 40 50)
echo ${a[0]}
//调用第一个值

 

数组切片(数组分隔)

0
0
(这里的起始位置的数字是从0开始算的,因此2就是第三个数字)
[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ky15]#echo ${a[@]:0:5}
1 2 3 4 5
[root@localhost ky15]#a[1]=9

#数组替换

[root@localhost ky15]#echo ${a[1]}
9
[root@localhost ky15]#echo ${a[@]}
1 9 3 4 5
[root@localhost ky15]#echo ${b[@]/西瓜/葡萄}
#只是显示没有真正的修改
橘子 香蕉 葡萄
[root@localhost ky15]#echo ${b[@]}
橘子 香蕉 西瓜
[root@localhost ~]#list=”1 2 3 4 5″
#先定义列表
[root@localhost ~]#list1=($list)
#再定义数组
[root@localhost ~]#echo ${list1[@]}
1 2 3 4 5
 
找到最大值:
0
 
 

冒泡

#!/bin/bash
a=(100 120 180 90 110)
l=${#a[@]}
#将数组的长度 赋值给 l 数组的总长度为5
for ((i=1;i<$l;i++))
do
for ((j=0;j<$l-1;j++))
do
first=${a[$j]}
#定义第一个数
k=$[$j+1]
#定义第二数的下标
second=${a[$k]}
#定义第二个数
if [ $first -gt $second ]
#比较 前后两个数的大小
then
temp=${a[$j]}
#将大的数 放入 空变量中
a[$j]=$second
#将小的数 往前 定义
a[$k]=$temp
#将大的数 往后定义
fi
done
done
echo ${a[@]}
 

grep

-m 匹配多少次停止
-v 取反
-i 忽略大小写
-n 显示匹配所在的行号
-c 显示匹配了多少次
-o 只匹配选中的
-w 只匹配单词
-q 静默输出,不显示结果,但是操作了
-A 关于比配的后多少行 -A 3 后三行
-B 前多少行 -B 3
-C 前后 多少行 -C 3
-e 多项过滤 or
-r 递归,但不处理软链接
-R 递归,处理软链接
 
//选项:

-color=auto 对匹配到的文本着色显示

-m  # 匹配#次后停止

grep -m 1 root /etc/passwd #多个匹配只取第一个

-v 显示不被pattern匹配到的行,即取反

grep -Ev ‘^[[:space:]]*#|^$’ /etc/fstab

-i 忽略字符大小写

-n 显示匹配的行号

-c 统计匹配的行数

grep -c root /etc/passwd #统计匹配到的行数

-o 仅显示匹配到的字符串

-q 静默模式,不输出任何信息

-A # after, 后#行

grep -A3 root /etc/passwd #匹配到的行后3行业显示出来

-B # before, 前#行

-C # context, 前后各#行

-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ‘ -e ‘dog’ file

grep -e root -e bash /etc/passwd #包含root或者包含bash 的行

grep -E root|bash /etc/passwd

-w 匹配整个单词

grep -w root /etc/passwd

useradd rooter

-E 使用ERE,相当于egrep

-F 不支持正则表达式,相当于fgrep

-f file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件

-r   递归目录,但不处理软链接

-R   递归目录,但处理软链接

0
 
 
 

echo

echo -n 表示不换行输出
echo -e 表示输出转义符
常用的转义符
选项
作用
\n
输出换行
\r
光标移至行首,并且不换行
\s
当前shell的名称,如bash
\t
插入Tab键
\f
换行,但光标仍停留在原处
\ \
表示插入”\”本身
\b
表示退格 不显示前一个字符
\c
抑制更多的输出或不换行
[root@localhost ky15]#echo -e “12345\b678”

##退格删除前面的字符

1234678

[root@localhost ky15]#echo -e “12345\b\b678”

123678

[root@localhost ky15]#echo -e “12345\b\b\b678”

12678

[root@localhost ky15]#echo -e “12345\b\b\b\b678”

16785

###注意退格键和末尾的字符相关,超过末尾的字符数量 会出bug 了解即可

[root@localhost ky15]#echo -e “12345678\c”

12345678[root@localhost ky15]#echo -e “1234\c5678”

1234[root@localhost ky15]#

###\c 注意 使用在数字中间会把后面内容删除

 
date
date查看当前系统时间
-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间
%F 完整日期格式,等价于 %Y-%m-%d
% T 时间(24小时制)(hh:mm:ss)
[root@localhost ~]# date -d ‘-1 day’ +%F

2021-10-21

[root@localhost ~]# date +%F

2021-08-19

[root@localhost ~]# date -d ‘1 day ‘ +%F-%T

2021-08-20-23:28:42

[root@localhost mnt]# date -d “-3 day” 前三天

2021年 08月 18日 星期三 11:30:15 CST

[root@localhost mnt]# date -d “+3 day” 后三天

2021年 08月 18日 星期三 11:30:15 CST

[root@localhost data]#date -d ‘1 day ‘ +%F’ ‘%T

2021-10-22 00:45:37

日历

[root@localhost data]#cal 2021

#查看日历

[root@localhost data]#cal 9 1752

九月 1752

日 一 二 三 四 五 六

1 2 14 15 16

17 18 19 20 21 22 23

24 25 26 27 28 29 30

 

原文地址:http://www.cnblogs.com/qfrg/p/16822616.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性