シェルスクリプトで 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

