read
读取控制台输入的信息
基本语法 read (选项) (参数)
- ①选项:-p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待
- ②参数变量:指定读取值的变量名
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim read.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . read.sh
请输入尊姓大名北海冬木
Welcome 北海冬木
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat read.sh
read -p "请输入尊姓大名" name
echo "Welcome $name"
函数
系统函数
basename
:获取文件名
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# basename /home/dongmu/shellStudy/fun.sh
fun.sh
如果后面还带有参数就会当成后缀然后去掉之后再返回
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# basename /home/dongmu/shellStudy/fun.sh .sh
fun
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# basename /home/dongmu/shellStudy/fun.sh sh
fun.
dirname
:获取文件的路径,就是文件名去掉
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# dirname /home/dongmu/shellStudy/fun.sh
/home/dongmu/shellStudy
我这里测试了它不存在目录发现也不会报错,说明这里是根据/来判断的,就是去掉最后一个/以及其后面的内容
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# dirname /home/dongmu/shellStudy/fun.ssh
/home/dongmu/shellStudy
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# dirname /home/dongmu/shellSstudy/fun.ssh
/home/dongmu/shellSstudy
date
获取系统时间
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# date
Thu Apr 21 02:27:09 PM CST 2022
自定义函数
- 自定义函数的格式
function 函数名()(这个小括号可上省略)
{
这里面写函数体。
return 值。(可省略)
}
- 函数需要的参数不需要定义,直接使用
$1、$2、$3
即可获取。 - 函数的返回值直接使用
$?
即可获取 - shell是一个解释语言,一行一行解释执行。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . fun.sh
请输入加数12
请输入被加数56
68
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat fun.sh
function sum ()
{
s=0
s=$[ $1+$2 ]
echo $s
}
read -p "请输入加数" n1
read -p "请输入被加数" n2
sum $n1 $n2
带有return的函数;
- 要注意
$?
只能获取0-255的值,多了就溢出了。 - 如果我们想获取值就先复制给一个变量,然后取变量的值就行了。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim fun.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . fun.sh
14
请输入加数12
请输入被加数21
33
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat fun.sh
function sum ()
{
s=0
s=$[ $1+$2 ]
echo $s
}
function multi
{
e=$[$1*$2]
return $e
}
multi 2 7
echo $?
read -p "请输入加数" n1
read -p "请输入被加数" n2
sum $n1 $n2
文件归档
- 实际生产应用中,往往需要对重要数据进行归档备份。
- 需求:实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/), 将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive 下。
- 这里用到了归档命令:tar 后面可以加上-c 选项表示归档,加上-z 选项表示同时进行压缩,得到的文件后缀名 为.tar.gz。
下面编写一个脚本对我的一个文件进行归档,输入为文件的全路径
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat file.sh
#!/bin/bash
# 首先判断输入参数的个数是否是1,不是1就有问题
if [ $# -ne 1 ]
then echo "参数个数错误"
exit
fi
# 从输入参数中获取当前的目录名称
# 判断是否是一个文件的全路径
if [ -f $1 ]
then echo
else
echo
echo "文件目录不存在"
echo
exit
fi
#把这个文件的名字取出来
DIR_NAME=$(basename $1)
#把这个文件的路径取出来
DIR_PATH=$(cd $(dirname $1); pwd )
# 读取当前日期
DATE=$(date +%y%m%d)
#定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
#生成的归档文件的路径,也就是归档之后压缩包的存放位置
DEST=/home/crm/crmLogout/$FILE
echo "开始归档"
echo
#进行归档,第一个参数是归档的目的地,第二个参数是需要归档的文件的地址
tar -czf $DEST $1
if [ $? -eq 0 ]
then
echo
echo
echo "归档成功"
echo "归档文件为:$DEST"
echo
else
echo "归档文件出现问题"
echo
fi
exit
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ./file.sh /home/crm/nohup.out
开始归档
tar: Removing leading `/' from member names
归档成功
归档文件为:/home/crm/crmLogout/archive_nohup.out_220421.tar.gz
[root@iZwz9hv1phm24s3jicy8x1Z crmLogout]# ls
archive_nohup.out_220421.tar.gz
[root@iZwz9hv1phm24s3jicy8x1Z crmLogout]# tar -zxvf archive_nohup.out_220421.tar.gz
home/crm/nohup.out
[root@iZwz9hv1phm24s3jicy8x1Z crmLogout]# ls
archive_nohup.out_220421.tar.gz home
[root@iZwz9hv1phm24s3jicy8x1Z crmLogout]# cd home
[root@iZwz9hv1phm24s3jicy8x1Z home]# ls
crm
[root@iZwz9hv1phm24s3jicy8x1Z home]# cd crm
[root@iZwz9hv1phm24s3jicy8x1Z crm]# ls
nohup.out
定时任务
对于我们项目部署之后会不断地生成文件,如果我们想让我们的linux服务器定时地在每天00点进行文件的归档,然后把原来的文件清空,就可以编写一个shell脚本,然后添加到定时任务中即可。
- 编写shell脚本
这个脚本是把输出Hello World!
放到test.txt
文件中
echo "Hello World!">> /home/dongmu/shellStudy/test.txt
- 编写定时任务执行脚本
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# crontab -e
* * * * * /home/dongmu/shellStudy/time.sh
#上面这个定时任务的意思是每分钟执行一次time.sh这个脚本。
#查看系统的定时任务
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# crontab -l
* * * * * /home/dongmu/shellStudy/time.sh
- 下面验证是否成功
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat test.txt
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
可以发现每分钟都在添加文件,说明我们的脚本和定时任务都执行成功了。
编写脚本定时拷贝文件到另一个目录,然后把原来文件内容清除,防止单个文件过大
(当然这里只是提供一个思路,具体实现么没有这么简单,考虑是cp还是mv等)
DATE=$(date +%y%m%d)
cp /home/crm/nohup.out /home/crm/crmLogout/nohup_${DATE}.out
rm -f /home/crm/nohup.out
touch /home/crm/nohup.out
然后把这个脚本放在定时任务里面即可。