ORD 和 CHR Bash 中的一个文件
ORD and CHR a file in Bash
我构建了 ord
和 chr
函数,它们工作得很好。
但是如果我取一个包含 \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
这仍然存在两个问题:您将无法拥有空字节并且您将看不到结尾的换行符。例如(我将你的脚本命名为 banana
和 chmod +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 < ""
就这么简单!
我构建了 ord
和 chr
函数,它们工作得很好。
但是如果我取一个包含 \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
这仍然存在两个问题:您将无法拥有空字节并且您将看不到结尾的换行符。例如(我将你的脚本命名为 banana
和 chmod +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 < ""
就这么简单!