最近这两天刚好在学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后执行的操作
下的代码。如果用户输入的是其他内容,就执行 # 输入其他内容时的操作
下的代码。
;;
表示结束这个分支,代码中有多个分支时使用。
这段脚本可以用来询问用户是否执行某个操作,或者根据用户的输入执行不同的操作。