1

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

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

这是我所期望的行为。的内容$*(由空格x hello world指定set并由空格分隔)通过外壳参数扩展运行以删除任何回声前导,从而导致hello world,我用周围的括号呼应以证明缺少周围的空白。

我无法在 bash (5.0.2(1)-release) 中复制它。看来空间,一个分隔符,是不可访问的:

% 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,它是 dash。)

4

1 回答 1

2

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

这是一个显示此的示例:

$ set -- hello world "hello world with spaces"
$ echo "${*// /<SPACE>}"
hello world hello<SPACE>world<SPACE>with<SPACE>spaces

每个参数中的空格都可以很好地替换,但是插入的它们之间的空格$*不受影响。

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

于 2019-03-08T22:26:14.237 回答