带替换的参数扩展,避免附加变量
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:]]/-}"
但感觉很老套。
一个选项可以是在本地将 bash 的内部字段分隔符 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:]]/-}"
我正在尝试连接输入 $*
,这是一个由所有参数加在一起组成的参数。
这有效。
#!/bin/bash
foo() {
params="${*}"
echo "${params//[[:space:]]/-}"
}
foo 1 2 3 4
1-2-3-4
但是,是否可以跳过变量的赋值?
"${"${*}"//[[:space:]]/-}"
我收到 bad substitution
错误。
我也可以
: "${*}"
echo "${_//[[:space:]]/-}"
但感觉很老套。
一个选项可以是在本地将 bash 的内部字段分隔符 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:]]/-}"