在bash中评估字符串空间的奇怪行为

时间:2013-05-13 15:33:25

标签: linux bash shell busybox

我在bash中有以下字符串

pseed="  0  0  0 45 46 78 99100" #there is 2 spaces between 2 zeros

我的字符串包含3个字符串中每个字符串的数字。如果数字<然后用数字填充空格。我想用通用格式${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中避免这种行为?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

从可用文档here

${string:position:length}

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

我相信你应该回应的是${pseed:3:3}以获得单个0。

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