代码之家  ›  专栏  ›  技术社区  ›  qeatzy

如何用分隔符联接参数?[副本]

  •  1
  • qeatzy  · 技术社区  · 8 年前

    这个问题已经有了答案:

    在bash中,如何将函数的参数连接成单个字符串?

    分隔器是固定的,不是空间(因此 "$*" 不是我想要的。这里用 ", " 举个例子。

    join_args() {
    # join args with sep ", ", then echo the joined string
    # ... code here
    }
    
    join_args abc def ghi
    # abc, def, ghi
    
    3 回复  |  直到 8 年前
        1
  •  2
  •   choroba    8 年前

    $* 如果设置$ifs,则可以使用空格以外的字符,但它只能使用一个字符。因此

    join_args() {
        local IFS=', '
        echo "${*}"
    }
    

    输出 abc,def,ghi .

    如果需要更长的分隔符,则必须使用循环:

    join_args() {
        while (($# > 1)) ; do
            printf '%s, ' "$1"
            shift
        done
        if (($#)) ; then
            printf '%s\n' "$1"
        fi
    }
    

    或者,使用真正的编程语言:

    perl -E 'say join ", ", @ARGV' abc def ghi
    
        2
  •  1
  •   dawg    8 年前

    您可以尝试:

    $ function join_by { local IFS="$1"; shift; echo "$*"; }
    

    然后由以下人员使用:

    $ join_by , abc def ghi
    abc,def,ghi
    

    如果你想在 ", " 使用 sed 我想:

    $ join_by , abc def ghi | sed -e 's/,/, /g'
    abc, def, ghi
    

    或者你可以用 printf 因此,参数展开:

    $ function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; }
    $ arr=( abc def ghi "kl mn op" )
    $ echo $(join_by ", " "${arr[@]}")
    abc, def, ghi, kl mn op
    
        3
  •  0
  •   Konstantin Vustin    8 年前
    #!/usr/bin/env bash
    
    join_args() {
      count=$#
      for i in `seq 1 $count`
      do
       if [[ $i = $count ]]
       then
         joined+=("$1")
       else
        joined+=("$1,")
        shift
       fi
      done
    echo ${joined[*]}
    }
    
    join_args abc def ghi sfl ugw pwg afm
    

    输出:

    abc, def, ghi, sfl, ugw, pwg, afm