1

我在 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预期的

但是当我显示第二个 0 时

$echo ${pseed:3:6}
0 0

我明白0 0了,这是出乎意料的。

发生了什么?

我在显示时指出:

$pseed="  0  0  0  0"
$echo $pseed
0 0 0 0

零之间只有一个空格。

如何避免bash中的这种行为?

4

2 回答 2

1

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

$ 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

内置命令的bash扩展使得从字符串中提取固定宽度的字段变得更容易一些:read

arr=()
while read -n 3 num; do   # -n 3: read 3 characters at a time
    arr+=($num)
done <<< "$pseed"         # Quote to preserve whitespace
于 2013-05-13T15:49:33.457 回答
0

此处可用的文档中:

${string:position:length}

Extracts $length characters of substring from $string at $position.

我相信你应该试图回应的是${pseed:3:3}得到一个 0。

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

于 2013-05-13T15:46:11.840 回答