本文通过一个shell脚本批量删除redis中的key的例子,来讲解一个最简单的shell脚本所需要的控制结构和基本语法。

首先来看一下脚本全貌:

#!/bin/bash
read -p "请输入要删除的日期(格式:20200923):" date
read -p "请输入要删除缓存的表:" table

redis_comm=redis-cli
redis_content=*$table*$date*

$redis_comm keys $redis_content > redis_keys.txt
linenum=`wc -l redis_keys.txt | awk '{ print $1 }'`
if [ 0 -eq $linenum ]; then
        echo "没有相关的key,退出。"
        exit
fi

IFS=$'\n'
for line in `cat redis_keys.txt`
do
        echo $line
        $redis_comm del $line
done

输入参数获取

笔者redis中key的格式为日期和数据表的组合,在脚本启动后,可以通过提示来让用户输入日期和表名:通过read -p即可定义变量,后续使用可以通过$变量名来使用。

read -p "请输入要删除的日期(格式:20200923):" date
read -p "请输入要删除缓存的表:" table

接下来直接定义了两个新的变量,一个redis_comm为连接redis的命令,redis_content为通过用户输入的变量组合成的key的正则匹配式,都不需要添加引号:

redis_comm=redis-cli
redis_content=*$table*$date*

数据流重定向到文件、管道命令、判断逻辑

下面通过$redis_comm变量运行redis-cli keys,通过数据流重定向来把每行的key输出到redis_keys.txt文件中来进行缓存,这里注意要用">"符号,如果用">>"就是在文件末尾追加内容,但是此处如果有上次遗留的redis_keys.txt文件,我们是想要直接替换,所以要用">":

$redis_comm keys $redis_content > redis_keys.txt
linenum=`wc -l redis_keys.txt | awk '{ print $1 }'`
if [ 0 -eq $linenum ]; then
        echo "没有相关的key,退出。"
        exit
fi

之后,检查了redis_keys.txt文件的行数,如果是空文件,则退出脚本。这里是通过符号执行了shell命令,命令中通过管道把输出交给awk处理,awk命令中通过打印命令结果行中第一个数字来获取行数。再和0比较,如果相等则退出,此处注意if的比较符号[]中,每个组件两边都要添加空格。exit命令会直接退出脚本。如果不为空文件,继续往下执行。

循环结构逐行获取内容

接下来是一个循环结构,首先修改分隔符环境变量IFS为换行符,来指定for循环中每项的粒度为一行。


IFS=$'\n'
for line in `cat redis_keys.txt`
do
        echo $line
        $redis_comm del $line
done

对每一行进行迭代时,先是打印出正在处理的行,在通过redis-cli del 每行的内容,来删除对应的key值,这样一个简单批量删除redis的key的脚本就完成了。

对于出入职场的你想知道行业内技术水平如何么?遇到的技术点有没有由于长期没有再接触容易忘记呢?『全栈编程』刷题小程序就是专门来解决上述两个问题的,其中题目全部出自一线大厂小哥的工作实践,每月刷题最多的同学可以任选100元以内图书一本哦~