如何使用分隔符连接参数?

时间:2018-07-17 04:46:34

标签: arrays bash

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

分隔符是固定的,不是空格(因此"$*"不是我想要的)。这里以", "为例。

join_args() {
# join args with sep ", ", then echo the joined string
# ... code here
}

join_args abc def ghi
# abc, def, ghi

3 个答案:

答案 0 :(得分:2)

如果设置$ IFS,

var dateFormatter = DateFormatter() dateFormatter.timeStyle = .short var selectedTime = dateFormatter.string(from: Date()) 可以使用空格以外的其他字符,但是只能使用一个字符。因此

$*

输出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
}

答案 1 :(得分:1)

您可以尝试:

$ 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

答案 2 :(得分:0)

#!/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