【问题标题】:How to join arguments with a separator? [duplicate]如何使用分隔符连接参数? [复制]
【发布时间】:2018-12-24 16:23:00
【问题描述】:

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

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

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

join_args abc def ghi
# abc, def, ghi

【问题讨论】:

    标签: arrays bash


    【解决方案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】:

      $* 如果设置了 $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
      

      【讨论】:

      • 如果 args 计数 > 3,您的第二个 join_args() 将丢失 arg
      • @KonstantinVustin:糟糕,谢谢。固定。
      【解决方案3】:
      #!/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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 2017-07-03
        • 1970-01-01
        • 2020-07-27
        • 2016-11-20
        • 2016-06-04
        • 1970-01-01
        相关资源
        最近更新 更多