シェルスクリプトで echo の表示が崩れる原因

.htacces」で拒否するIPアドレスがあって、定期的にそのIPアドレスをアクセス数を通知するシェルスクリプトがあります。

「.htaccess」からRequire not ipの行をgrepで取得して、ログファイルでそのIPアドレスのアクセス数を集計して通知。1ヶ月くらいアクセスが無くなったら「.htaccess」から削除するって運用です

そのシェルスクリプトでechoを使っている箇所で、表示が崩れます。具体的には先頭の数文字が消えてしまします。

原因をよくよく考えてみると、この「.htaccess」ですが他の会社の方も触ることがあるファイルなので、ファイルをダウンロードしてWindowsで表示して文字コードがおかしくなっているのではと推測しました

表示が崩れる原因

ファイルを下記コマンドで改行コードなどの文字も見れるようにcat コマンドで確認します

$ cat -A /var/www/vhost/example.com/html/.htaccess

結果:

<RequireAll>^M$
    Require all granted^M$
    Require not ip 10.100.xxx.0/24^M$

cat -A オプションは、ファイル内のすべての文字(不可視文字を含む)を可視化して表示する 時に使います。
文字化けする時はWindowsの改行キーとか入っている可能性が高いので、その場合は上記のオプションで確認すると良いかと思います

解決策:改行コードをLF(Unix)に統一


テキストファイルの改行コードを CRLF(DOS/Windows) や CR(Mac 旧形式) から LF(Unix/Linux) に変換するコマンドの dos2unix コマンドを使用してLFに統一すればOKです

$ sudo dos2unix var/www/vhost/example.com/html/.htaccess
dos2unix: converting file /var/www/vhost/ouen-ya.com/html/.htaccess to Unix format..

上記コマンドでLFに統一されます

また、sed でも変換可能です

$ sudo sed -i 's/\r$//' /var/www/vhost/example.com/html/.htaccess

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です