Linux bash中计算字符串中空格的奇怪行为

Linux bash中计算字符串中空格的奇怪行为,linux,bash,shell,busybox,Linux,Bash,Shell,Busybox,我在bash中有以下字符串 pseed=" 0 0 0 45 46 78 99100" #there is 2 spaces between 2 zeros 我的字符串在每个由3个字符组成的组中包含一个数字。如果数字

我在bash中有以下字符串

pseed="  0  0  0 45 46 78 99100" #there is 2 spaces between 2 zeros
我的字符串在每个由3个字符组成的组中包含一个数字。如果数字<100,则该数字用空格填充。我想用一种通用格式提取所有数字,
${pseed:3*I:3}
,我想在while循环中使用这种格式

当我想显示第一个0时:

$echo ${pseed:0:3}
0
我得到了预期的
0

但是当我用DS0播放第二个0时

$echo ${pseed:3:6}
0 0
我得到
0 0
,这是出乎意料的

发生了什么事

我注意到在展示时:

$pseed="  0  0  0  0"
$echo $pseed
0 0 0 0
零之间只有一个空格


如何在bash中避免此类行为?

来自可用文档:

我相信您应该尝试回显的是
${pseed:3:3}
以获得单个0


至于问题的第二部分,echo看到了4个参数,并用一个空格将它们打印出来。为了保留空白,您需要使用以下文档中的
echo“$pseed”

我相信您应该尝试回显的是
${pseed:3:3}
以获得单个0


至于问题的第二部分,echo看到了4个参数,并用一个空格将它们打印出来。为了保留空白,您需要使用
echo“$pseed”

您需要引用变量扩展,以防止任意运行的空白被视为单个单词分隔符

$ pseed="  0  0  0 45 46 78 99100"
$ echo x${pseed:3:6}x
x 0 0x
$ echo "x${pseed:3:6}x"
x  0  0x
内置的
read
命令的
bash
扩展使从字符串中提取固定宽度字段变得更加容易:

arr=()
while read -n 3 num; do   # -n 3: read 3 characters at a time
    arr+=($num)
done <<< "$pseed"         # Quote to preserve whitespace
arr=()
读取时-n3num;do#n 3:一次读3个字符
arr+=($num)

完成您需要引用变量扩展,以防止任意运行的空格被视为单个单词分隔符

$ pseed="  0  0  0 45 46 78 99100"
$ echo x${pseed:3:6}x
x 0 0x
$ echo "x${pseed:3:6}x"
x  0  0x
内置的
read
命令的
bash
扩展使从字符串中提取固定宽度字段变得更加容易:

arr=()
while read -n 3 num; do   # -n 3: read 3 characters at a time
    arr+=($num)
done <<< "$pseed"         # Quote to preserve whitespace
arr=()
读取时-n3num;do#n 3:一次读3个字符
arr+=($num)

如您所见,我的字符串在每个由3个字符组成的组中包含一个数字。如果数字<100,则该数字用空格填充,我想用通用格式
${pseed:3*I:3*I+3}
提取所有数字,我想在while循环中使用此格式。在这种情况下,第三个参数始终是3:
${pseed:3*I:3}
。记住,第三个参数是长度,不是末端位置。你是对的,我的表达式是错的。我在问题中进行了更新,因为您可以看到我的字符串在每个由3个字符组成的组中包含一个数字。如果数字<100,则该数字用空格填充,我想用通用格式
${pseed:3*I:3*I+3}
提取所有数字,我想在while循环中使用此格式。在这种情况下,第三个参数始终是3:
${pseed:3*I:3}
。记住,第三个参数是长度,不是末端位置。你是对的,我的表达式是错的。我更新了这个问题