ORD和CHR在Bash中的一个文件



我构建了ordchr函数,它们运行得很好。但如果我取一个包含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

这仍然留下了两个问题:不能有空字节,也不能看到尾随的换行符。例如(我称您的脚本为bananachmod +x banana):

$ ./banana <(printf 'abn')
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 'abn')
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"

就这么简单!

相关内容

最新更新