【发布时间】:2019-03-09 06:42:09
【问题描述】:
使用破折号 (0.5.10.2),我可以这样做:
% dash
$ set -- x hello world
$ echo "<${*#x }>"
<hello world>
这是我所期望的行为。 $* 的内容(由set 分配并由空格分隔的x hello world)通过shell parameter expansion 运行以删除任何前导x 以进行回声,从而产生hello world,我' m 与周围的括号相呼应,以表明缺少周围的空白。
我无法在 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。)
【问题讨论】:
-
当我读到pubs.opengroup.org/onlinepubs/9699919799/utilities/…:如果参数是
#、*或@,扩展的结果是未指定的。 -- 所以两者同样正确,并且想要在所有 POSIX 平台上工作的脚本不应该依赖任何一种行为。 (var=$*和${var// /<SPACE>},你已经准备好了)。 -
@CharlesDuffy - Err... 嗯.. 不是
${var// /<SPACE>}带有子字符串替换的参数扩展 .. bashism? POSIX 仅在我阅读时提供 suffix 和 prefix 删除。 -
@DavidC.Rankin,非常正确。尽管如此,
var=$*避免依赖未定义行为的观点仍然成立。 -
@DavidC.Rankin – 这是一个 bash 问题,所以 bashism 没问题......虽然我使用
var="$*"; echo "${var#x }"达到同样的效果,因为我很少在 bash 中编写脚本,我试图限制我的 bash 脚本的 bashisms 到了绝对必要的地方。 -
同意,我只是对您明显使用
dash感到困惑。
标签: bash shell parameter-expansion