Linux bash中计算字符串中空格的奇怪行为
我在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个字符组成的组中包含一个数字。如果数字
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}
。记住,第三个参数是长度,不是末端位置。你是对的,我的表达式是错的。我更新了这个问题