写个bash脚本快速创建博客

Posted by Distiny on January 4, 2023

最近这两天刚好在学shell脚本,而且一直用linux,写博客不太方面,和之前windows一样,这次写个shell脚本,用来快速新建博客。

最后搞了半天也算是比较完善了,借此巩固一下shell脚本的用法。

#!/bin/bash

# 获取脚本参数
name=$1

# 获取当前日期
date=$(date "+%Y-%m-%d")

# 组装文件名
filename="${date}-${name}.md"

# 判断文件是否存在
if [[ -f "${filename}" ]]
then
    # 文件存在,询问用户是否覆盖
    read -p "文件已存在,是否覆盖?[y/N] " yn
    case $yn in
        [Yy]*)
            # 用户选择覆盖,执行创建文件操作
            if cat > "${filename}" << EOF
---
layout:     post
title:      ${name}
subtitle:   
date:       ${date}
author:     Distiny
header-img: img/post-bg-normal.jpg
catalog: true
tags:
    - Blog
---
EOF
            then
                echo "创建成功"
                # 检查是否有 typora
                if command -v typora > /dev/null
                then
                    # 用 typora 打开文件
                    nohup typora "${filename}" &>/dev/null &
                else
                    echo "未安装 typora,无法打开文件"
                fi
            else
                echo "创建失败"
                exit 1
            fi
            ;;
        [Nn]*)
            # 用户选择不覆盖,退出脚本
            echo "取消创建"
            exit 0
            ;;
        *)
            # 用户输入无效,退出脚本
            echo "无效输入"
            exit 1
            ;;
    esac
else
    # 文件不存在,执行创建文件操作
    if cat > "${filename}" << EOF
---
layout:     post
title:      ${name}
subtitle:   
date:       ${date}
author:     Distiny
header-img: img/post-bg-normal.jpg
catalog: true
tags:
    - Blog
---
EOF
    then
        echo "创建成功"
        # 检查是否有 typora
        if command -v typora > /dev/null
        then
            # 用 typora 打开文件
            nohup typora "${filename}" &>/dev/null &
        else
            echo "未安装 typora,无法打开文件"
        fi
    else
        echo "创建失败"
        exit 1
    fi
fi

里面有几个有趣的点

# 检查是否有 typora
if command -v typora > /dev/null

 #  其中command -v 用来显示后面可执行文件的命令command -v typora
/usr/bin/typora
# 用 typora 打开文件
nohup typora "${filename}" &>/dev/null &

使用 nohup 命令可以在后台运行 typora 命令,&>/dev/null 将标准输出和标准错误重定向到 /dev/null,避免在后台运行时打印多余的信息(否则nohup会把标准输出和标准错误重定向到文件nuhup.out。最后的 & 也表示在后台运行,但是一般如果只有最后的&的话,并不会忽略 SIGHUP 信号,如果当前终端关闭,命令也会停止。

read -p "文件已存在,是否覆盖?[y/N] " yn
case $yn in
[Yy]*)
    # 输入Y或者y后执行的操作
    ;;
[Nn]*)
    # 输入N或者n后执行的操作
    ;;
*)
    # 输入其他内容时的操作
    ;;
esac

这段脚本中,使用 read 命令输出文本 “文件已存在,是否覆盖?[y/N] “,并等待用户输入。用户输入的内容会被保存到变量 yn 中。

然后使用 case 语句判断用户输入的内容。如果用户输入的是 y 或者 Y,就执行 # 输入Y或者y后执行的操作 下的代码。如果用户输入的是 n 或者 N,就执行 # 输入N或者n后执行的操作 下的代码。如果用户输入的是其他内容,就执行 # 输入其他内容时的操作 下的代码。

;; 表示结束这个分支,代码中有多个分支时使用。

这段脚本可以用来询问用户是否执行某个操作,或者根据用户的输入执行不同的操作。