Mono Works

チラシのすきま

ブログを書き始めるためのスクリプト(hugo関連スクリプト 第1回)

shell scriptの勉強を始めて、hugoを使う上で便利かなと思えるスクリプトを作成したので、少しずつ紹介します。本日は、これまで使っていた新規記事作成用のスクリプトを見直したものになります。

201807isogiyoshi01 美味しいお魚が食べられる福岡のお店 磯ぎよし

今回のスクリプト

うちのホームページには、ブログ記事の他に、お知らせ記事と固定ページがあります。お知らせ記事は、ブログ記事と少しだけフォーマットの異なるテンプレートを使っているので、今回のスクリプトでは、最初に、ブログ記事を書くか、お知らせ記事を書くか、を選択するようにしました。

なお、固定ページの作成方法は、少し手法が異なるので、スクリプトを使わずに手動で作成してます。

#!/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のアカウントが必要です)
執筆者
"ぽぽろんち" @pporoch
pporoch120
Mono Worksの中の人。好きなことをつらつらと書き留めてます。
ギターを始めてから 練習動画をYouTubeにアップしてます。ご笑納ください。
"DQX@ぬここ(UD487-754)、コツメ(NO078-818)"
採用案内