作成経緯
GitHubにファイル末尾が改行になっていないファイルをアップすると怒られます。
なぜファイル末尾に改行を入れるのか
入っていないと、エラーになる可能性もあるらしい。
今やっているスクールでは必須要件なので、プロジェクト内のファイルが全て末尾改行になっていることを確かめるツールがあれば、後々楽になるだろうと思い、シェルスクリプトを書いてみることに。bashは一度も書いたことがなかったので練習も兼ねて書いてみます。
動作確認は、今扱っているRailsのビューだけなので、さまざまな条件で期待通り動かすには、それなりの改良が必要と思います。
コード
#!/bin/bash
subject=""
find ./ -type f -print | xargs tail -c 1 | while read line; do
if [ "${line:0:3}" = "==>" ]; then
subject=${line}
else
str=$(echo ${line} | xxd -p)
if [ ! "${str}" = "0a" ]; then
echo "${subject}"
fi
fi
done
説明
find ./ -type f -print | xargs tail -c 1 | while read line; do
-
find ./ -type f -print
で実行ディレクトリ以下のファイルを再帰的に検索 -
xargs tail -c 1
で検索結果のファイルの最後の文字を取得 -
while
でファイルごとにループ処理
if [ "${line:0:3}" = "==>" ]; then
subject=${line}
-
"${line:0:3}" = "==>”
で行頭が”==>”に合致する行を変数に格納する。”==>”はtail
コマンドから出力されたファイル名のある行の行頭。
str=$(echo ${line} | xxd -p)
if [ ! "${str}" = "0a" ]; then
echo "${subject}"
-
echo ${line} | xxd -p
でファイル末尾文字を16進数の文字コードに変換。xxd
は16進数に変換するコマンド。 -
! "${str}" = "0a"
でファイル末尾が”0a”(LF改行)になっていない条件で、ファイル名をecho
で標準出力。
参考サイト
-
findの使い方
【find・grep】特定の文字列を含むファイルのリストを取得する方法。
-
xxdの使い方
最後の文字が改行かどうか調べる
逆引きUNIXコマンド/16進数文字列をバイナリ化・16進数を文字列化する・xxd -
while文の書き方
ShellScript【 while read 】ファイルを1行ずつ読み込む -
文字列の切り抜き
bashで変数から部分文字列を取得する