带替换的参数扩展,避免附加变量

Parameter expansion with replacement, avoid additional variable

我正在尝试连接输入 $*,这是一个由所有参数加在一起组成的参数。

这有效。

#!/bin/bash

foo() {
    params="${*}"
    echo "${params//[[:space:]]/-}"
}

foo 1 2 3 4
1-2-3-4

但是,是否可以跳过变量的赋值?

"${"${*}"//[[:space:]]/-}"

我收到 bad substitution 错误。

我也可以

: "${*}"
echo "${_//[[:space:]]/-}"

但感觉很老套。

一个选项可以是在本地将 的内部字段分隔符 IFS 设置为 - 而只是 echo "$*":

foo() {
    local IFS=$'-'
    echo "$*"
}

要回答您的问题,您可以像这样对位置参数进行全局模式替换:

${*//pat/sub}
${@//pat/sub}

还有这样的数组:

${arr[*]//pat/sub}
${arr[@]//pat/sub}

这不会加入参数,而是在参数内部进行替换。

将 IFS 设置为破折号会在 echo "$*"p=$* 的每个参数之间添加破折号,但不会替换 参数中的任何内容。

例如:

$ set -- aa bb 'cc   cc'
$ IFS=-
$ echo "$*"
aa-bb-cc   cc

要删除所有空格,包括参数内部的空格,您可以将它们组合起来:

IFS=-
echo "${*//[[:space:]]/-}"

或者像您一样先分配一个名字:

no_spaces=$*
echo "${no_spaces//[[:space:]]/-}"