连接函数的所有参数/删除变量中的所有空格

连接函数的所有参数/删除变量中的所有空格

连接函数的所有参数的好方法是什么?

我现在得到的是迭代它们并连续附加它们:

func(){
concat=
for arg in "$@"
do
    concat=$concat$arg
done
echo $concat
}

我想做一些类似的事情:

another_func() {
echo $(remove_spaces $@)
}

答案1

concat () (
    IFS=''
    printf '%s\n' "$*"
)

该函数使用"$*"(双引号很重要),它将扩展为单个字符串,其中位置参数(参数)的值与$IFS作为分隔符的第一个字符的值连接。

我们设置IFS为空字符串,这意味着"$*"将扩展到没有分隔符的所有参数连接。

$IFS另请注意,我们通过将shell 脚本的其余部分( ... )(而不是通常的{ ... }.

在另一个函数中调用这个函数可能看起来像

other_func () {
    printf '%s\n' "$( concat "$@" )"
}

或者更短,无需实际调用该concat函数:

other_func () {
    ( IFS=''; printf '%s\n' "$*" )
}

要删除参数列表中的所有空格,请使用

printf '%s\n' "$*" | tr -d ' '

例如,

concat_delete_sp () {
    printf '%s\n' "$*" | tr -d ' '
}

测试:

$ concat 1 2 3 "h h h" o o o
123h h hooo
$ concat_delete_sp 1 2 3 "h h h" o o o
123hhhooo

答案2

对于基于第二个示例的方法的少量资源快速解决方案:

func(){
  a=$@;echo ${a// /}
}

通过这种方式,您将删除所有空格。但如果您打算使用包含空格的参数,请记住@kusalananda 的方法。

答案3

zshshell 中,您可以使用j:separator:参数扩展标志将数组的元素与任意分隔符连接起来。所以你可以这样做:

concat=${(j::)argv}

或者

concat=${(j::)@}

$argv连接aka数组的元素,$@而不必修改像这样的全局参数$IFS

如果只是要打印参数,使用类似 Bourne 的 shell,您始终可以这样做:

concat() {
  printf %s "$@" || return
  [ "$#" -eq 0 ] || printf '\n' # empty output if no argument
}

andprintf的内置函数还可以将结果存储在变量中:bashzsh

printf -v variable %s "$@"

通过fishshell,您可以使用:

echo -s -- $argv

(如果是空列表,则打印空行$argv)。

相关内容