Shell编程学习(四)read读取、函数、文件归档、定时任务

本文介绍了Shell脚本中read命令的使用,包括读取控制台输入及设置提示符和超时。还讲解了系统函数如basename和dirname的功能,并展示了date命令获取系统时间。接着,文章通过示例介绍了如何在Shell中定义和调用函数,包括带返回值的函数。此外,还演示了文件归档的脚本实现,利用tar进行归档和压缩。最后,提到了如何设置定时任务执行脚本,以及简单的文件操作示例。
摘要由CSDN通过智能技术生成

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

然后把这个脚本放在定时任务里面即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海冥鱼未眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值