我构建ord并chr运行,它们工作得很好。但是,如果我获取一个包含 的文件\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)
你的ord功能真的很奇怪。也许写成这样会更好:
function ord { \n printf -v ordr "%d" "\'$1"\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后你可以将它用作:
\n\nTEXT=$(cat "$1")\nfor (( i=0; i<${#TEXT}; i++ )); do \n ord "${TEXT:$i:1}" \n printf \'%s\\n\' "$ordr"\ndone\nRun Code Online (Sandbox Code Playgroud)\n\n这仍然留下两个问题:您将无法拥有空字节,并且您将看不到尾随换行符。例如(我调用你的脚本banana和chmod +x banana):
$ ./banana <(printf \'a\\0b\\n\')\n97\n98\nRun Code Online (Sandbox Code Playgroud)\n\n这里显示了两个问题:空字节从 Bash 部分中删除TEXT=$(cat "$1"),因为 Bash 变量不能包含空字节。此外,此步骤还会修剪尾随换行符。
更稳健的方法是使用read:
while IFS= read -r -n 1 -d \'\' char; do\n ord "$char"\n printf \'%s\\n\' "$ordr"\ndone < "$1"\nRun Code Online (Sandbox Code Playgroud)\n\n通过此修改:
\n\n$ ./banana <(printf \'a\\0b\\n\')\n97\n0\n98\n10\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,此脚本将取决于您的区域设置。使用我的语言环境 ( LANG="en_US.UTF-8):
$ ./banana <(printf \'a\\0\xe2\x84\x82\\n\')\n97\n0\n8450\n10\nRun Code Online (Sandbox Code Playgroud)\n\n然而:
\n\n$ LANG= ./banana <(printf \'a\\0\xe2\x84\x82\\n\')\n97\n0\n226\n132\n130\n10\nRun Code Online (Sandbox Code Playgroud)\n\n这是为了向您展示 Bash 不读取bytes,而是读取 strings。因此,根据您希望 Bash 如何处理数据,进行LANG相应的设置。
ord如果您的脚本仅执行此操作,那么根本不使用函数会简单得多:
#!/bin/bash\n\nwhile IFS= read -r -n 1 -d \'\' char; do\n printf \'%d\\n\' "\'$char"\ndone < "$1"\nRun Code Online (Sandbox Code Playgroud)\n\n就这么简单!
\n| 归档时间: |
|
| 查看次数: |
7416 次 |
| 最近记录: |