Edited at

シェルスクリプトで引数を16進表示

More than 5 years have passed since last update.


arg_check.sh

#!/bin/sh

cd `dirname $0`
echo 'argc:'$#
echo 'argv:'$*
echo $* | od -tx1z -w16
exit 0

ekaneko@bibian ~/work % # シェルスクリプト内で使う場合

ekaneko@bibian ~/work % cat > arg_check.sh
#!/bin/sh
cd `dirname $0`
echo 'argc:'$#
echo 'argv:'$*
echo $* | od -tx1z -w16
exit 0
ekaneko@bibian ~/work % sh ./arg_check.sh `date '+%Y-%m-%d %T'`
argc:2
argv:2014-05-23 11:51:13
0000000 32 30 31 34 2d 30 35 2d 32 33 20 31 31 3a 35 31 >2014-05-23 11:51<
0000020 3a 31 33 0a >:13.<
0000024
ekaneko@bibian ~/work % # コマンドラインで使う場合
ekaneko@bibian ~/work % echo `date '+%Y-%m-%d %T'` | od -tx1z -w16
0000000 32 30 31 34 2d 30 35 2d 32 33 20 31 34 3a 34 35 >2014-05-23 14:45<
0000020 3a 35 38 0a >:58.<
0000024
ekaneko@bibian ~/work % # ファイル内容をダンプ
ekaneko@bibian ~/work % od -tx1z -w16 arg_check.sh
0000000 23 21 2f 62 69 6e 2f 73 68 0a 63 64 20 60 64 69 >#!/bin/sh.cd `di<
0000020 72 6e 61 6d 65 20 24 30 60 0a 65 63 68 6f 20 27 >rname $0`.echo '<
0000040 61 72 67 63 3a 27 24 23 0a 65 63 68 6f 20 27 61 >argc:'$#.echo 'a<
0000060 72 67 76 3a 27 24 2a 0a 65 63 68 6f 20 24 2a 20 >rgv:'$*.echo $* <
0000100 7c 20 6f 64 20 2d 74 78 31 7a 20 2d 77 31 36 0a >| od -tx1z -w16.<
0000120 65 78 69 74 20 30 0a >exit 0.<
0000127
ekaneko@bibian ~/work %


解説

シェルでバイナリダンプする使用例です。

ファイルのダンプとシェルスクリプト内でのダンプを行うサンプルです。

詳細は od コマンドのMANを調べて下さい。


経緯

aws に持っていったプログラムが動かずに困り、

調査の結果、引数が何か違うとなった時に調べる必要があったためです。

便利です。


原因

UTF8 BOM が引数先頭にくっついていました。

16進数の EF BB BF です。

DBを検索した結果をパイプ(>)でファイルに一旦出力後、そのファイルより取得した値を使用していたのが問題だったようです。

その時の対応は引数を渡されたphp内でbomを切り取る関数を通して対応しました。

※ 標準出力をそのままダイレクトに使用した方が良いです。大変ですが…。


bomChomp

phpです

// ========================================

// ちょっとした関数
// ========================================
// BOM付きUTF8からBOMを削除する
// 環境によってはBOM付きUTF8になる
function bomChomp($valDate)
{
if(($valDate == NULL) || (mb_strlen($valDate) == 0)) {
return '';
}
if(ord($valDate{0})==0xef && ord($valDate{1})==0xbb && ord($valDate{2})==0xbf)
{
$valDate = substr($valDate, 3);
}
return $valDate;
}