bashprintf
関数を使用して入力ファイル内の文字のASCIIコードを印刷しますが、何らかの理由でprintf
出力LF
文字に10の代わりにASCIIコード0が表示されます。どんなアイデアがありますか?
while IFS= read -r -n1 c
do
ch=$(LC_CTYPE=C printf "%d\n" "'$c") # convert to integer
echo "ch=$ch"
done < input_file_name
printf
正直なところ、これが問題なのか、それとも関数が間違ったLF値を提供しているのかはわかりませんread
... bashコマンドを使用して文字をASCIIに変換する別の方法はありますか?
答え1
まず、printf機能は完全に機能します。
$ export c=" "
$ LC_CTYPE=C printf "%d\n" "'$c"
32
ただし、-vxを使用してスクリプト行を実行すると、その行に到着するデータが正しくないことがわかります(この出力は貼り付けません)。
だから私はそれが読み取りエラーだと思います。読み取り用のデフォルトのEOL区切り文字は改行文字なので変更してみました。これは効果があると思います。
while IFS= read -d\0 -r -n1 c; do ch=$(LC_CTYPE=C printf "%d\n" "'$c") ; echo "ch=$ch"; done < input_file_name
答え2
何の問題もありませんが、read
結果の解釈が少し間違っています。
EOLフラグは\n
なので、その文字を入力すると文字がread
ない「行」が発生するという意味です。この変数には以下は$c
含まれません\n
。
while IFS= read -r c
do
test -z "$c" && echo "Zero length string" || echo "I read '$c'"
done
追加すると、-n1
読み取り可能な文字数を1つに制限できます。上記の例のように\n
許可される文字列の一部ではないため、次のようにread
入力すると「nothing」が返されます\n
。
while IFS= read -r -n1 c
do
test -z "$c" && echo "Zero length string" || echo "I read '$c'"
done
このprintf
コマンドは興味深いです。一重引用符の前に長さゼロの文字列を入力すると、「0」も取得されるため、ここで答えは「しないでください」と思われます。
LC_CTYPE=C printf "%d" "'" | od -c
0000000 0