Bash 中的 ORD 和 CHR 文件

Jho*_*a99 1 bash chr ord

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

hello
CHECK THIS HIT
YES
Run Code Online (Sandbox Code Playgroud)

当我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
Run Code Online (Sandbox Code Playgroud)

gni*_*urf 6

你的ord功能真的很奇怪。也许写成这样会更好:

\n\n
function ord { \n    printf -v ordr "%d" "\'$1"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你可以将它用作:

\n\n
TEXT=$(cat "$1")\nfor (( i=0; i<${#TEXT}; i++ )); do \n    ord "${TEXT:$i:1}" \n    printf \'%s\\n\' "$ordr"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

这仍然留下两个问题:您将无法拥有空字节,并且您将看不到尾随换行符。例如(我调用你的脚本bananachmod +x banana):

\n\n
$ ./banana <(printf \'a\\0b\\n\')\n97\n98\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

更稳健的方法是使用read

\n\n
while IFS= read -r -n 1 -d \'\' char; do\n    ord "$char"\n    printf \'%s\\n\' "$ordr"\ndone < "$1"\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过此修改:

\n\n
$ ./banana <(printf \'a\\0b\\n\')\n97\n0\n98\n10\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$ ./banana <(printf \'a\\0\xe2\x84\x82\\n\')\n97\n0\n8450\n10\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而:

\n\n
$ LANG= ./banana <(printf \'a\\0\xe2\x84\x82\\n\')\n97\n0\n226\n132\n130\n10\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是为了向您展示 Bash 不读取bytes,而是读取 strings。因此,根据您希望 Bash 如何处理数据,进行LANG相应的设置。

\n\n
\n\n

ord如果您的脚本仅执行此操作,那么根本不使用函数会简单得多:

\n\n
#!/bin/bash\n\nwhile IFS= read -r -n 1 -d \'\' char; do\n    printf \'%d\\n\' "\'$char"\ndone < "$1"\n
Run Code Online (Sandbox Code Playgroud)\n\n

就这么简单!

\n