【问题标题】:Weird behaviour in evaluating spaces in string in bash在bash中评估字符串中的空格时的奇怪行为
【发布时间】:2013-05-13 15:33:24
【问题描述】:

我在 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 中避免这样的行为?

【问题讨论】:

    标签: linux bash shell busybox


    【解决方案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
    

    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
    

    【讨论】:

      【解决方案2】:

      来自here的可用文档:

      ${string:position:length}
      
      Extracts $length characters of substring from $string at $position.
      

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

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

      【讨论】:

      • 如您所见,我的字符串在每个 3 个字符的块中包含一个数字。如果数字
      • 我想提取所有具有通用格式${pseed:3*i:3*i+3}的数字,我想在while循环中使用这种格式
      • 在这种情况下,第三个参数始终是 3${pseed:3*i:3}。请记住,第三个参数是长度,而不是结束位置。
      • 你是对的我的表达是错误的。我在问题中更新了
      猜你喜欢
      • 1970-01-01
      • 2013-11-16
      • 2017-02-18
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多