Bash参数扩展无法匹配$ *和$ @

时间:2019-03-08 22:18:57

标签: bash shell parameter-expansion

使用破折号(0.5.10.2),我可以这样做:

% dash
$ set -- x hello world
$ echo "<${*#x }>"
<hello world>

这是我期望的行为。 $*的内容(由x hello world分配的set由空格分隔)通过外壳parameter expansion运行,以删除任何前导进行回显,因此产生了hello world,我在括号内回显了周围空白的情况。

我无法在bash(5.0.2(1)-发行版)中复制它。似乎无法访问该分隔符的空间:

% bash
$ set -- x hello world
$ echo "<${*#x }>"
<x hello world>
$ echo "<${@#x }>"     # trying $@ instead of $*
<x hello world>
$ echo "<${*#x}>"      # without the space works but now I have a space
< hello world>
$ echo "<${*#x?}>"     # trying the `?` wildcard for a single character
<x hello world>
$ echo "<${*#x\ }>"    # trying to escape the space
<x hello world>
$ echo "<${*/#x /}>"   # using bash pattern substitution instead
<x hello world>
$ echo "<${*#x$IFS}>"  # trying the input field separator variable
<x hello world>

这里有解决方案吗?也许可以通过某种方式修改$*或更改输出字段分隔符?

我当前的解决方法是将其分配给一个临时变量,但这很丑陋。 (我需要bash,否则我会坚持使用/ bin / sh,这是破折号。)

1 个答案:

答案 0 :(得分:2)

对于类似数组的操作数,在将每个元素 连接到空格之前,对每个元素应用字符串操作。因此,您不能将它们应用于联接空间。

下面是显示此示例:

<div class="grid-wrapper">
  <div class="grid-item">Content D</div>
  <div class="grid-item">Content E</div>
  <div class="grid-item">Content J</div>
  <div class="grid-item">Content K</div>
  <div class="grid-item">Content D</div>
  <div class="grid-item">Content E</div>
  <div class="grid-item">Content J</div>
  <div class="grid-item">Content K</div>
  <div class="grid-item">Content L</div>
  <div class="grid-item">Content D</div>
  <div class="grid-item">Content E</div>
  <div class="grid-item">Content J</div>
  <div class="grid-item">Content K</div>
  <div class="grid-item">Content L</div>
</div>

每个参数中的空格都可以很好地替换,但是$ set -- hello world "hello world with spaces" $ echo "${*// /<SPACE>}" hello world hello<SPACE>world<SPACE>with<SPACE>spaces 插入它们之间的空格不会受到影响。

解决方法确实是一个临时变量。