ORD 和 CHR Bash 中的一个文件

ORD and CHR a file in Bash

我构建了 ordchr 函数,它们工作得很好。 但是如果我取一个包含 \n 的文件,例如:

hello
CHECK THIS HIT
YES

当我 ord 一切时,我没有得到任何新的行值。这是为什么?我正在写 Bash。

这是我正在使用的代码:

function ord { 
    ordr="`printf "%d\n" \'`" 
}

TEXT="`cat `"
for (( i=0; i<${#TEXT}; i++ )) 
do 
    ord "${TEXT:$i:1}" 
    echo "$ordr" 
done

你的ord函数真奇怪。也许写成这样会更好:

function ord { 
    printf -v ordr "%d" "'"
}

那么您可以将其用作:

TEXT=$(cat "")
for (( i=0; i<${#TEXT}; i++ )); do 
    ord "${TEXT:$i:1}" 
    printf '%s\n' "$ordr"
done

这仍然存在两个问题:您将无法拥有空字节并且您将看不到结尾的换行符。例如(我将你的脚本命名为 bananachmod +x banana):

$ ./banana <(printf 'a[=12=]b\n')
97
98

这里有两个问题:空字节从 TEXT=$(cat "") 部分的 Bash 中删除,因为 Bash 变量不能包含空字节。此外,此步骤还会修剪尾随换行符。

更稳健的方法是使用 read:

while IFS= read -r -n 1 -d '' char; do
    ord "$char"
    printf '%s\n' "$ordr"
done < ""

修改后:

$ ./banana <(printf 'a[=14=]b\n')
97
0
98
10

请注意,此脚本将取决于您的语言环境。使用我的语言环境 (LANG="en_US.UTF-8):

$ ./banana <(printf 'a[=15=]ℂ\n')
97
0
8450
10

鉴于:

$ LANG= ./banana <(printf 'a[=16=]ℂ\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 < ""

就这么简单!