ORD和CHR是Bash中的一个文件

时间:2015-02-12 11:44:13

标签: bash chr ord

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

1 个答案:

答案 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

这仍然存在两个问题:您无法获得空字节,并且您不会看到尾随换行符。例如(我调用了您的脚本bananachmod +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"

就这么简单!