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