在bash中,如何将N个参数连接在一起作为空格分隔的字符串

Posted

技术标签:

【中文标题】在bash中,如何将N个参数连接在一起作为空格分隔的字符串【英文标题】:In bash, how do I join N parameters together as a space separated string 【发布时间】:2012-08-30 07:01:09 【问题描述】:

我正在尝试编写一个函数,它接受 n 个参数并将它们连接成一个字符串。

在 Perl 中是

my $string = join(' ', @ARGV);

但在 bash 中我不知道该怎么做

function()

    ??

【问题讨论】:

仅供参考,function 关键字是一个扩展,它使您的代码无缘无故地与 POSIX 不兼容(与 bash 的许多其他实际上增加价值的扩展相比);实际上不需要声明一个函数。 【参考方案1】:

查看 bash 手册页的特殊参数下的“*”条目。

join () 
    echo "$*"

【讨论】:

澄清一下,$IFS 的第一个字符用于分隔符。 如果需要处理带引号的参数,其实正确的解决方案是"$@" 这里的目标是将所有参数折叠成一个字符串,因此$*$@ 的选择无关紧要。或者更确切地说,由 join 的使用者来引用结果,而不管使用哪个参数来访问 args。 引用也可用于保护其他特殊字符,而不仅仅是单个空白字符。 "join" 可能打算使用 /usr/bin/join,因此 "spjoin" 可能是一个更安全的名称【参考方案2】:

对于直接的问题,chepner's answer ("$*") 是最简单的,但作为如何依次访问每个参数的示例:

func()
    str=
    for i in "$@"; do 
        str="$str $i"
    done
    echo $str# 

【讨论】:

为了安全起见,您或许应该声明 local strlocal ifor i; do 默认处理 "$@" 但这显然只是一个简写。【参考方案3】:

这个行为类似于 Perl join:

#!/bin/bash

sticker() 
  delim=$1      # join delimiter
  shift
  oldIFS=$IFS   # save IFS, the field separator
  IFS=$delim
  result="$*"
  IFS=$oldIFS   # restore IFS
  echo $result


sticker , a b c d efg 

以上输出:

a,b,c,d,efg

【讨论】:

使用local IFS="$delim",您不必担心必须恢复它。【参考方案4】:

类似于 perreal 的回答,但带有一个子外壳:

function strjoin () (IFS=$1; shift; echo "$*");
strjoin : 1 '2 3' 4
1:2 3:4

Perl 的连接可以用多个字符分隔,并且在 bash 中使用起来足够快 (直接或使用别名或函数包装器)

perl -E 'say join(shift, @ARGV)'  ', '   1 '2 3' 4
1, 2 3, 4

【讨论】:

以上是关于在bash中,如何将N个参数连接在一起作为空格分隔的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 bash shell 中将一个字符串拆分为多个字符串,至少用一个空格分隔?

如何在不折叠空格的情况下在 bash 脚本中拆分制表符分隔的字符串?

将空格分隔的字符串读入 Bash 中的数组

在c ++中输入n个空格分隔的整数

bash - 压缩多个文件,从变量中获取参数,其中一个在名称中有空格[重复]

Linux常用命令——xargs