shell scriptの勉強を始めて、hugoを使う上で便利かなと思えるスクリプトを作成したので、少しずつ紹介します。本日は、これまで使っていた新規記事作成用のスクリプトを見直したものになります。
今回のスクリプト
うちのホームページには、ブログ記事の他に、お知らせ記事と固定ページがあります。お知らせ記事は、ブログ記事と少しだけフォーマットの異なるテンプレートを使っているので、今回のスクリプトでは、最初に、ブログ記事を書くか、お知らせ記事を書くか、を選択するようにしました。
なお、固定ページの作成方法は、少し手法が異なるので、スクリプトを使わずに手動で作成してます。
#!/bin/bash
# 環境変数:hugoの作業ディレクトリ
readonly HUGO_DIR="/mnt/c/《自分なりのPath》"
# 環境変数:VSCode 実行ファイルの場所
readonly VSCODE_DIR="/mnt/c/Program Files/Microsoft VS Code/Code.exe"
if cd "$HUGO_DIR"; then
:
else
echo "存在しないディレクトリがhugoの作業ディレクトリに指定されています。"
exit
fi
echo "hugoを始める
1. ブログを書く
2. 会社のお知らせを書く
3. キャンセル
選択(1-3):"
read -r choice_to_do
case $choice_to_do in
[1]* )
echo -n "ブログ slug(日付以外の部分)
※ 半角英数とハイフンのみ使用可、スペースを入れない
(入力):"
read -r headline
echo -n "ブログ 日付
※ 半角数字とハイフンのみ使用可、スペースを入れない
yyyy-mm-dd(空なら当日の日付)形式で
(入力):"
read -r date
echo -n "ブログタイトル(フリー入力)
(入力):"
read -r title
# archetypes/default.md を使用して記事を生成
if [ -z "$date" ]; then
date="$(date +"%Y-%m-%d")"
fi
slug="$date-$headline"
file_name="post/${slug}.md"
file_path="content/$file_name"
if [ ! -e "$file_path" ]; then
hugo new "$file_name"
sed -i -e "s/title = \".*\"/title = \"${title}\"/g" "$file_path"
sed -i -e "s/slug = \".*\"/slug = \"${slug}\"/g" "$file_path"
sed -i -e "s/# タイトルをここに/# ${title}/g" "$file_path"
else
echo "$file_name はすでに存在します。"
fi
"$VSCODE_DIR" "$file_path"
;;
[2]* )
echo -n "お知らせ slug(日付以外の部分)
※ 半角英数とハイフンのみ使用可、スペースを入れない
(入力):"
read -r headline
echo -n "お知らせ 日付
※ 半角数字とハイフンのみ使用可、スペースを入れない
yyyy-mm-dd(空なら当日の日付)形式で
(入力):"
read -r date
echo -n "お知らせ タイトル(フリー入力)
(入力):"
read -r title
# archetypes/news.md を使用して記事を生成
if [ -z "$date" ]; then
date="$(date +"%Y-%m-%d")"
fi
slug="$date-$headline"
file_name="news/${slug}.md"
file_path="content/$file_name"
if [ ! -e "$file_path" ]; then
hugo new "$file_name"
sed -i -e "s/date = \".*\"/date = \"${date}T00:00:01+09:00\"/g" "$file_path"
sed -i -e "s/title = \".*\"/title = \"${title}\"/g" "$file_path"
sed -i -e "s/slug = \".*\"/slug = \"${slug}\"/g" "$file_path"
sed -i -e "s/# タイトルをここに/# ${title}/g" "$file_path"
else
echo "${file_name} はすでに存在します。"
fi
"$VSCODE_DIR" "$file_path"
;;
[3]* )
echo "終了します...."
exit
;;
* )
echo "1 から 3 の半角数字を入力して下さい。"
;;
esac
ブログかお知らせを選択した後は、slug、日付、タイトルを指定して、日付と slugをくっ付けたもの(こっちが本来の slug)から、生成するファイルの名前とパスを設定。
ファイル名の重複チェックをおこない、重複がなければファイルを生成し、ファイル内の一部テキストを差し替えた後、生成したファイルを VSCodeで開きます。
作業環境(追記:2018/07/24)
VSCodeで記事を書いて、VSCode上のターミナルからWSLを起動してスクリプトを走らせ、hugoは WSLにインストールしたものを使ってます。具体的な環境構築方法は、こちらに書いてます。
shebang
スクリプトの最初に書いている shebangですが、WSLで Ubuntuを使っているので、/bin/sh は dash へのシンボリックリンクになってます。
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 18 2016 /bin/sh -> dash
で、互換問題を回避するため、下記記事を参考に shebangは #!/bin/bash
としました。
参考:Ubuntuの/bin/shはbashではなくdash | Siguniang’s Blog
何もしないけど
下記部分は、$HUGO_DIR が存在する場合は、何もせずに次の処理に移行して、$HUGO_DIR が存在しない場合は、メッセージを表示して終了という処理になります。何もしないけど何か書いておいた方がいい時に、何もしないコマンドである:
を書いてます。
if cd "$HUGO_DIR"; then
:
else
echo "存在しないディレクトリがhugoの作業ディレクトリに指定されています。"
exit
fi
echo -n オプション
echo
に -n
というオプションを付けると、メッセージ最後の改行が出力されません。下記のような場合に、入力待ちのプロンプトが (入力):
の後ろに表示されるので、-n
を付けてました。
echo -n "お知らせ slug(日付以外の部分)
※ 半角英数とハイフンのみ使用可、スペースを入れない
(入力):"
キャンセルについて
実行時の選択肢として、ブログを書く、お知らせを書く、キャンセル、の 3つを用意したのですが、実際にWSLで作業していると、Ctrl + C
で強制終了できるので キャンセル は不要かなとも思ったのですが、お作法的に「どれも選ばない」という選択肢がないのはアカンかなと思い、とりあえず付けております。
バグチェック
下記ページにスクリプトを貼り付けると、バグをチェックしてくれます。
参考:ShellCheck – shell script analysis tool
次回は、hugo serverによる Webサーバ起動とかその辺のスクリプトです。
コメント
コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)