まず、head
であることを示しましょう。 実際に正しく動作しています:
$ printf '\xef\xbb\xbf' >file
$ head -c 3 file
$ head -c 3 file | hexdump -C
00000000 ef bb bf |...|
00000003
それでは、機能する関数 has_bom
を作成しましょう . grep
の場合 -P
をサポート の場合、1 つのオプションは次のとおりです。
$ has_bom() { head -c3 "$1" | LC_ALL=C grep -qP '\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes
現在、GNU grep
のみ -P
をサポート .
別のオプションは、bash の $'...'
を使用することです :
$ has_bom() { head -c3 "$1" | grep -q $'\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes
ksh
と zsh
$'...'
もサポート しかし、この構造は POSIX および dash
ではありません はサポートしていません。
注:
<オール>
明示的な return $?
の使用 オプションです。この関数は、デフォルトで、最後に実行されたコマンドの終了コードを返します。
関数の定義には POSIX 形式を使用しました。これは bash 形式と同等ですが、別のシェルで関数を実行する必要がある場合に対処する問題が 1 つ少なくなります。
bash は文字 -
の使用を受け入れます 関数名に含まれていますが、これは物議を醸す機能です。 _
に置き換えました これはより広く受け入れられています。 (この問題の詳細については、この回答を参照してください。)
-q
grep
へのオプション 静かにします。つまり、適切な終了コードを設定しますが、stdout には文字を送信しません。
最初の読み取り行に以下を適用しました:
read c
if (( "$(printf "%d" "'${c:0:1}")" == 65279 )) ; then c="${c:1}" ; fi
これにより、変数から BOM が削除されるだけです。