【发布时间】: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
【问题讨论】:
在bash中,如何将函数的参数连接成一个字符串?
分隔符是固定的,不是空格(因此"$*" 不是我想要的)。这里以", " 为例。
join_args() {
# join args with sep ", ", then echo the joined string
# ... code here
}
join_args abc def ghi
# abc, def, ghi
【问题讨论】:
你可以试试:
$ 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
【讨论】:
$* 如果设置了 $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
【讨论】:
join_args() 将丢失 arg
#!/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
【讨论】: