我构建了ord
和chr
函数,它们运行得很好。
但是,如果我采用包含\n
的文件,例如:
hello
CHECK THIS HIT
YES
当我ord
时,我不会获得任何新的行值。这是为什么?我在Bash写作。
以下是我正在使用的代码:
function ord {
ordr="`printf "%d\n" \'$1`"
}
TEXT="`cat $1`"
for (( i=0; i<${#TEXT}; i++ ))
do
ord "${TEXT:$i:1}"
echo "$ordr"
done
答案 0 :(得分:3)
你的ord
功能真的很奇怪。也许最好把它写成:
function ord {
printf -v ordr "%d" "'$1"
}
然后你会用它作为:
TEXT=$(cat "$1")
for (( i=0; i<${#TEXT}; i++ )); do
ord "${TEXT:$i:1}"
printf '%s\n' "$ordr"
done
这仍然存在两个问题:您无法获得空字节,并且您不会看到尾随换行符。例如(我调用了您的脚本banana
和chmod +x banana
):
$ ./banana <(printf 'a\0b\n')
97
98
这里显示了两个问题:在TEXT=$(cat "$1")
部分从Bash中删除了空字节,因为Bash变量不能包含空字节。此外,此步骤还会修剪尾随换行符。
更强大的方法是使用read
:
while IFS= read -r -n 1 -d '' char; do
ord "$char"
printf '%s\n' "$ordr"
done < "$1"
通过此修改:
$ ./banana <(printf 'a\0b\n')
97
0
98
10
请注意,此脚本取决于您的区域设置。使用我的区域设置(LANG="en_US.UTF-8
):
$ ./banana <(printf 'a\0ℂ\n')
97
0
8450
10
,而:
$ LANG= ./banana <(printf 'a\0ℂ\n')
97
0
226
132
130
10
向您显示Bash没有读取字节,但是字符。因此,根据您希望Bash处理数据的方式,请相应地设置LANG
。
如果您的脚本只执行此操作,则根本不使用ord
功能要简单得多:
#!/bin/bash
while IFS= read -r -n 1 -d '' char; do
printf '%d\n' "'$char"
done < "$1"
就这么简单!