シェルスクリプト練習

入門UNIXシェルプログラミング / Amazon

を今読んでて、ちょっとでもシェル芸人に近づければと思ってます。(思ってない)

このブログの記事作成するときに記事のフォーマットだけ作るrakeタスクを無駄に作ってたんですが、 これまた無駄に shell script で書いてみました。

  • awk
  • sed
  • date の format

あたりを覚えることができたかなという感じ。

#!/bin/sh

RAW_FILE_NAME=$1
DATE=`date +"%Y-%m-%d %T+0900"`
YMD=`echo $DATE | awk '{print $1}'`

FILE_TITLE=`echo $RAW_FILE_NAME | \
  sed \
    -e "s/^[ ]*//"   \
    -e "s/\.md//g"   \
    -e "s/[ ]*\$//"  \
    -e "s/ /-/g"     \
    -e "s/[\!]*//g"  \
    -e "s/[?]*//g" | \
  tr '[A-Z]' '[a-z]'`

FILE_NAME="_posts/$YMD-$FILE_TITLE.md"

cat <<EOS > $FILE_NAME
---
title: $RAW_FILE_NAME
date:  $DATE
---
EOS

echo "Create $FILE_NAME"

sed の -e オプション毎に改行してるのはせめてもの優しさ

読みづらいことには変わりないですが。

あと FILE_TITLE を作ってる箇所の最後は大文字を全部小文字にするって処理です。 String#downcase 的な…

すべての正規表現が統一される日はこないんですかね :sob:

追記

デバッグ

foo.sh というファイルを作ったとして、実行時に $ sh -xv foo.sh などのようにオプションをつければいい感じにデバッグできる

  • -x : 実行するコマンドの内容を表示
  • -v : 何をしようとするかを表示してから実行

終了ステータスを見る

文字列が数値かどうかチェックするスクリプトのところで、

expr -- "$1" + 1 >/dev/null 2>&1
if [ $? -ge 2 ]; then
  return 1
fi

のような表現がありました

expr の結果と終了ステータスは以下のような形に

結果 終了ステータス
0 1
0 以外 0
計算不可 2 以上

(表のCSSがあたってないのはすいません)

なので $? (直前コマンドの実行ステータス) を使って判定するということもできるそうです。

こういうのは知ってて当たり前のレベルなのか、シェル芸と呼ばれるレベルなのか…

まとめ

結構細かい話多かったので色々読み飛ばしましたが、シェルスクリプトでがんばらないといけない日が万が一来たらリファレンス的に使います。

そんな日が来ないと信じて :innocent:

Contents