我使用 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