bash 读取换行符,printf 报告字符 0

bash 读取换行符,printf 报告字符 0

我使用 bashprintf函数打印输入文件中字符的 ASCII 代码,但由于某种原因,printf输出LF字符的 ASCII 代码为 0,而不是 10。有什么想法吗?

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函数read提供了错误的 LF 值...还有其他方法如何使用 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您可以将可以读取的字符数限制为一个。就像上面的示例一样,\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

相关内容