bashは改行文字を読み取り、printfは文字0を報告します。

bashは改行文字を読み取り、printfは文字0を報告します。

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

関連情報