勤労感謝の日に書いてみる:シェルスクリプトで“おつかれさま”プロンプト

こんにちは、さるまりんです。

ふだんターミナルって、どうしても “無機質なコマンドの世界” になりがちですよね。
でも、せっかく毎日使うなら、ちょっとだけ人にやさしいスクリプト があってもいいんじゃないか…?
そう思って今回は、シェルスクリプトで「確認プロンプト」と「ありがとう・おつかれさまメッセージ」を書いてみました。

環境は /bin/bash が使えればOK。macOSやAWS EC2のLinuxなどでも試せます。
今回は手元のmacOSで試しています。

1. 基本の「ほんとうに削除しますか?」プロンプト

まずは定番の「削除していいか確認する」プロンプトから。

confirm-delete.sh

#!/usr/bin/env bash

read -r -p "本当に削除しますか? (y/N): " yn

case "$yn" in
  [yY]|yes)
    echo "削除します…(ここでrmコマンドなどを実行)"
    # 例)rm -rf ./target
    ;;
  [nN]|"")
    echo "キャンセルしました。何も削除していません。"
    ;;
  *)
    echo "y か n で答えてください。キャンセルします。"
    ;;
esac

実行例はこんな感じでした:

本当に削除しますか? (y/N): N
キャンセルしました。何も削除していません。

本当に削除しますか? (y/N): y
削除します…(ここでrmコマンドなどを実行)

本当に削除しますか? (y/N): o
y か n で答えてください。キャンセルします。

read で入力を受け取り、case で分岐する、というシンプルな構成です。
[yY]|yes にしておくと、yyes の両方を受け付けられてちょっとだけ親切。

2. 「きょうもおつかれさま」プロンプトを作ってみる

ここからが今回の本題です。優しさをプラスしていきます。
ユーザーにいくつか質問を投げて、「きょうもおつかれさま」と返してくれるスクリプトです。

self-thanks.sh

#!/usr/bin/env bash

echo "===== きょうもおつかれさまプロンプト ====="
read -r -p "お名前(ニックネームでもOK): " name
read -r -p "きょう、いちばん頑張ったことは何ですか?: " effort
read -r -p "自分に一言メッセージを送るとしたら?: " message

echo
echo "----------------------------------------"
echo " ${name} さん、きょうもおつかれさまでした!"
echo " いちばん頑張ったこと: ${effort}"
echo " 自分へのひとこと: ${message}"
echo
echo " ほんとうに、よくここまでやりましたね。"
echo " すこし休んで、また元気にいきましょう。"
echo "----------------------------------------"

実行してみると:

===== きょうもおつかれさまプロンプト =====
お名前(ニックネームでもOK): さる
きょう、いちばん頑張ったことは何ですか?: 布団から出る
自分に一言メッセージを送るとしたら?: えらい!

----------------------------------------
 さる さん、きょうもおつかれさまでした!
 いちばん頑張ったこと: 布団から出る
 自分へのひとこと: えらい!

 ほんとうに、よくここまでやりましたね。
 すこし休んで、また元気にいきましょう。
----------------------------------------

布団から出るのも、十分「がんばり」ですよね…。爆ほめでいきましょう。
こうやってターミナルが自分をねぎらってくれるの、どうですか?冷たい世界にちょっと温もりを感じませんか?

3. select で「感謝先えらびメニュー」を作る

つぎは、勤労感謝の日らしく(?)誰に感謝を送りたいかを選ぶメニューselect で作ってみます。

thanks-menu.sh

#!/usr/bin/env bash

PS3="誰に感謝のメッセージを送りますか? (番号を入力): "

echo "===== きょうの感謝先えらび ====="

select target in "自分自身" "チームメンバー" "家族" "同僚" "おわる"; do
  case "$REPLY" in
    1)
      echo "自分自身に:きょうも本当におつかれさま。よく頑張りました!"
      ;;
    2)
      echo "チームメンバーに:いつも支えてくれてありがとう、一緒に乗り越えていきましょう!"
      ;;
    3)
      echo "家族に:いつも見守ってくれてありがとう。あなたのおかげで頑張れます。"
      ;;
    4)
      echo "同僚に:いつも協力してくれてありがとう!一緒に働けてうれしいです。"
      ;;
    5)
      echo "終了します。きょうもおつかれさまでした!"
      break
      ;;
    *)
      echo "1〜5の番号で選んでください。"
      ;;
  esac
done

実行ログはこんな雰囲気でした:

===== きょうの感謝先えらび =====
1) 自分自身        3) 家族            5) おわる
2) チームメンバー  4) 同僚
誰に感謝のメッセージを送りますか? (番号を入力): 3
家族に:いつも見守ってくれてありがとう。あなたのおかげで頑張れます。
誰に感謝のメッセージを送りますか? (番号を入力): 2
チームメンバーに:いつも支えてくれてありがとう、一緒に乗り越えていきましょう!
誰に感謝のメッセージを送りますか? (番号を入力): 1
自分自身に:きょうも本当におつかれさま。よく頑張りました!
誰に感謝のメッセージを送りますか? (番号を入力): 4
同僚に:いつも協力してくれてありがとう!一緒に働けてうれしいです。
誰に感謝のメッセージを送りますか? (番号を入力): 5
終了します。きょうもおつかれさまでした!

select簡単に番号付きメニューを作れる Bash のお手軽機能です。
PS3 変数でプロンプト文(「〜を入力」部分)を変えられるのも便利ですね。

4. ちょっと実用寄り(?):「ディレクトリのお掃除+ねぎらい」

最後は 作業用ディレクトリの中身を削除する前に確認してくれるスクリプトです。
削除後にちゃんと「おつかれさま」と言ってくれます。

clean-workdir.sh

#!/usr/bin/env bash

TARGET_DIR="./work"

echo "対象ディレクトリ: ${TARGET_DIR}"

read -r -p "本当に中身を削除しますか? (y/N): " yn

case "$yn" in
  [yY]|yes)
    echo "削除中です…"
    rm -rf "${TARGET_DIR:?}/"*
    echo "削除が完了しました。"
    echo
    echo "今日もメンテナンス作業、おつかれさまでした!"
    echo "見えないところでのこういうお掃除、本当に大事ですよね。"
    ;;
  [nN]|"")
    echo "キャンセルしました。作業してくれてありがとう!"
    ;;
  *)
    echo "y か n で答えてください。キャンセルします。"
    ;;
esac

実行例:

対象ディレクトリ: ./work
本当に中身を削除しますか? (y/N): yes
削除中です…
削除が完了しました。

今日もメンテナンス作業、おつかれさまでした!
見えないところでのこういうお掃除、本当に大事ですよね。

"${TARGET_DIR:?}/"* としているのは、変数が空のときに誤って / 配下を消しに行かないようにする ちょっとした安全策です。

まとめ:プロンプトひとつで、ターミナルが少しやさしくなる

今回は、

  • read で入力をもらう基本
  • caseselect で分岐・メニューを作るやり方
  • 確認付き削除や、「おつかれさま」「ありがとう」を返してくれるプロンプト

といったものを、勤労感謝の日にありがとうの気持ちと共に作ってみました。

中身としてはここまでで十分実用的だと思うので、
色付けや装飾(ANSIカラーやカーソル制御) は、また別の記事でじっくりやってみたいなと思っています。
sl コマンドみたいに、「CUIだけど楽しい」世界もありますしね。

読んでくださってありがとうございました。
それではまた!