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

use*_*124 15 string bash arguments

我正在尝试编写一个带有n个参数并将它们连接成一个字符串的函数.

在Perl中它会是

my $string = join(' ', @ARGV);
Run Code Online (Sandbox Code Playgroud)

但在bash我不知道该怎么做

function()
{
    ??
}
Run Code Online (Sandbox Code Playgroud)

che*_*ner 29

bash在特殊参数下检查手册页中的"*"条目.

join () {
    echo "$*"
}
Run Code Online (Sandbox Code Playgroud)

  • 为了澄清,`$ IFS`的第一个字符用于分隔符. (2认同)
  • 这里的目标是将所有参数折叠成一个字符串,因此选择“$*”或“$@”并不重要。或者更确切地说,由“join”的使用者来引用结果,无论使用哪个参数来访问参数。 (2认同)
  • “join”可能是 /usr/bin/join,因此“spjoin”可能是一个更安全的名称 (2认同)

Kev*_*vin 9

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

func(){
    str=
    for i in "$@"; do 
        str="$str $i"
    done
    echo ${str# }
}
Run Code Online (Sandbox Code Playgroud)


per*_*eal 7

这个行为像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 
Run Code Online (Sandbox Code Playgroud)

以上输出:

a,b,c,d,efg
Run Code Online (Sandbox Code Playgroud)

  • 使用 `local IFS="$delim"` 并且您无需担心必须恢复它。 (2认同)

bsb*_*bsb 5

与perreal的答案类似,但是有一个subshel​​l:

function strjoin () (IFS=$1; shift; echo "$*");
strjoin : 1 '2 3' 4
1:2 3:4
Run Code Online (Sandbox Code Playgroud)

Perl的联接可以用多个字符分开,并且足够快地从bash中使用(直接使用别名或函数包装器)

perl -E 'say join(shift, @ARGV)'  ', '   1 '2 3' 4
1, 2 3, 4
Run Code Online (Sandbox Code Playgroud)