Bash 参数扩展无法匹配 $* 和 $@ 等变量中的空格
Bash parameter expansion can't match spaces in variables like $* and $@
使用破折号 (0.5.10.2),我可以这样做:
% dash
$ set -- x hello world
$ echo "<${*#x }>"
<hello world>
这是我期望的行为。 $*
的内容(由 set
分配并由 space 分隔的 x hello world
是 运行 到 shell parameter expansion 删除回声的任何前导 x
,从而导致 hello world
,我用周围的括号回声以证明周围没有白色 space.
我无法在 bash(5.0.2(1)-版本)中复制它。分隔符 space 似乎无法访问:
% 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,这是破折号。)
对于类似数组的操作数,字符串操作应用于每个元素在它们加入spaces之前.因此,您不能将它们应用于连接 space.
下面是一个例子:
$ set -- hello world "hello world with spaces"
$ echo "${*// /<SPACE>}"
hello world hello<SPACE>world<SPACE>with<SPACE>spaces
每个参数中的空格都被替换得很好,但是 $*
插入的它们之间的 space 不受影响。
解决方法确实是一个临时变量。
使用破折号 (0.5.10.2),我可以这样做:
% dash
$ set -- x hello world
$ echo "<${*#x }>"
<hello world>
这是我期望的行为。 $*
的内容(由 set
分配并由 space 分隔的 x hello world
是 运行 到 shell parameter expansion 删除回声的任何前导 x
,从而导致 hello world
,我用周围的括号回声以证明周围没有白色 space.
我无法在 bash(5.0.2(1)-版本)中复制它。分隔符 space 似乎无法访问:
% 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,这是破折号。)
对于类似数组的操作数,字符串操作应用于每个元素在它们加入spaces之前.因此,您不能将它们应用于连接 space.
下面是一个例子:
$ set -- hello world "hello world with spaces"
$ echo "${*// /<SPACE>}"
hello world hello<SPACE>world<SPACE>with<SPACE>spaces
每个参数中的空格都被替换得很好,但是 $*
插入的它们之间的 space 不受影响。
解决方法确实是一个临时变量。