Bash 将值存储在变量中会增加一个字符的长度

Bash 将值存储在变量中会增加一个字符的长度,bash,perl,Bash,Perl,我正在使用perl内部bash脚本生成20位长的id。当我只运行perl时,它会给我20位长的字符串。如果我将它保存到变量,然后回显它,它的长度是21位。 有人能给我解释一下吗? 守则: perl-e'my@chars=(“0”。“9”);我的$string$字符串=$chars[rand@chars]表示0..19;打印$string;' ID=$(perl-e'my@chars=(“0”。“9”);my$string;$string.=$chars[rand@chars]表示0..19;p

我正在使用perl内部bash脚本生成20位长的id。当我只运行perl时,它会给我20位长的字符串。如果我将它保存到变量,然后回显它,它的长度是21位。 有人能给我解释一下吗? 守则:

perl-e'my@chars=(“0”。“9”);我的$string$字符串=$chars[rand@chars]表示0..19;打印$string;'
ID=$(perl-e'my@chars=(“0”。“9”);my$string;$string.=$chars[rand@chars]表示0..19;print$string;'))
echo$ID

您不会显示如何计算长度,但
echo
会打印带有尾随换行符的参数

sh
及其子体中,您可以使用
printf“%s'$ID”
进行打印,而不使用尾随的换行符

将您的
echo
和我的
printf
通过
xxd
来观察差异

例子 设置:

# ID="$(perl -e 'my @chars=("0".."9");my $string;$string.=$chars[rand @chars] for 0..19;print $string')"
printf
这是20个字符的精确输出。您甚至可以看到,在printf版本中,提示符是如何不出现在下一行的

echo

这是一个精确的21个字符的输出。最后一个字符是
0x0a
是一个换行符。

您不显示如何计算长度,但
echo
打印带有尾随换行符的参数

sh
及其子体中,您可以使用
printf“%s'$ID”
进行打印,而不使用尾随的换行符

将您的
echo
和我的
printf
通过
xxd
来观察差异

例子 设置:

# ID="$(perl -e 'my @chars=("0".."9");my $string;$string.=$chars[rand @chars] for 0..19;print $string')"
printf
这是20个字符的精确输出。您甚至可以看到,在printf版本中,提示符是如何不出现在下一行的

echo

这是一个精确的21个字符的输出。最后一个字符是
0x0a
是一个换行符。

为了完整起见,
echo
还有一个
-n
标志,用于抑制尾随的换行符。我计算将其传输到wc`| wc-c`的长度,但我的主要问题是第二个字符还有一个数字(可读的数字从0到9)后来我救了他file@ales_t这是高度不可移植的。见鬼,
echo
是高度不可移植的(是否尝试过
echo
文本字符串
-n
?实际上没有禁用echo选项的机制,但是POSIX说echo使用尾随的换行符精确地打印其参数。我还没有在
printf'%s\n'-“$@”之外找到POSIX echo。我几乎总是反对它。
⇒  printf'%s'$X | xxd
00000000:3439353739373736363439393831384957977766499818
00000010:33383363836⇒ echo$X | xxd<00000000:3439 3537 3937 3737 3636 3439 3938 3138 4957977766499818
00000010:3338 3336 0a 3836。
@Hahihula
wc
这样可能会计算换行符(
0a
在xxd的输出中)。你现在看到区别了吗?为了完整性,
echo
还有一个
-n
标志,用于抑制尾随的换行符。我计算了将其传输到wc`|wc-c`的长度,但我的主要问题是,第二个数字在以后保存时多了一个数字(从0到9的可读数字)file@ales_t这是高度不可移植的。见鬼,
echo
是高度不可移植的(是否尝试过
echo
文本字符串
-n
?实际上没有禁用echo选项的机制,但是POSIX说echo使用尾随的换行符精确地打印其参数。我还没有在
printf'%s\n'-“$@”之外找到POSIX echo。我几乎总是反对它。
⇒  printf'%s'$X | xxd
00000000:3439353739373736363439393831384957977766499818
00000010:33383363836⇒ echo$X | xxd<00000000:3439 3537 3937 3737 3636 3439 3938 3138 4957977766499818
00000010:3338 3336 0a 3836。
@Hahihula
wc
这样可能会计算换行符(
0a
在xxd的输出中)。您现在看到差异了吗?请通过输入Q提供示例输出和长度计算机制。请通过输入Q提供示例输出和长度计算机制。
# echo "$ID"
37308262201981702169
# echo "$ID" | wc -c
      21
# echo "$ID" | xxd
00000000: 3337 3330 3832 3632 3230 3139 3831 3730  3730826220198170
00000010: 3231 3639 0a                             2169.