我在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中避免这种行为?
答案 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"
。