如何在SHELL中用逗号分隔将数组转换为变量

时间:2018-12-18 18:42:16

标签: bash shell unix

我有一个数组,希望使用shell脚本将其转换为单个字符串或变量,以逗号分隔

我有数据数组,我只是打印里面的值。

  echo "${data[*]}"

输出:

  /QE-CI-RUN-71/workspace/QE-AU/57/testng-results_1.xml 
  /QE-CI-RUN-71/workspace/QE-AU/57/testng-results_2.xml

我只想将上面的输出存储在单个变量中并以逗号分隔,我想将其用作进一步参考。如何使用SHELL做到这一点?

数据数组是动态的,它可以具有n个值。我只需要获取这些内容并创建一个用逗号分隔的变量即可。

任何线索。...

5 个答案:

答案 0 :(得分:3)

要使定位IFS的更改更容易,请使用以下函数:

join () {
  local IFS="$1"
  shift
  echo "$*"
}

join , "${data[@]}"

答案 1 :(得分:2)

有几种方法可以做到这一点。

更改$IFS字段分隔符(请注意,chepner's functional answer更优雅):

OLD_IFS="$IFS"
IFS=","
echo "${data[*]}"
IFS="$OLD_IFS"

大括号将更改范围限制为$IFS(否则您以后会感到惊讶)。

浏览其内容:

delim=""
for item in "${data[@]}"; do
  printf "%s" "$delim$item"
  delim=","
done
echo # add a newline

假设$IFS中的第一个字符(默认为空格)不在数组的任何项目中,则可以将数组另存为字符串,然后对其进行替换:

data_string="${data[*]}"
echo "${data_string//${IFS:0:1}/,}"

${IFS:0:1}$IFS的子字符串,从一个字符的开始到结束。

答案 2 :(得分:1)

如果要用逗号分隔,请使其成为IFS中的第一个字符:

data=( first second third )
IFS=,
echo "${data[*]}"

...发出:

first,second,third

答案 3 :(得分:0)

printComma(){
    printf "%s," "${@:1:${#}-1}"
    printf "%s" "${@:${#}}"
}
printNewline(){
    printf "%s\n" "${@:1:${#}-1}"
    echo "${@:${#}}"
}
join () {
  local IFS="$1"
  shift
  echo "$*"
}
declare -a comma=(
    a
    b
    c
)
declare -a newline=(
    xyz
    abc
    def
    ghi
)
echo "\
Comma separated list $(printComma "${comma[@]}")
Newline list: $(printNewline "${newline[@]}")

Comma separated list $(join , "${comma[@]}")
Newline list: $(join \n "${newline[@]}")"
Comma separated list a,b,c
Newline list: xyz
abc
def
ghi

Comma separated list a,b,c
Newline list: xyznabcndefnghi

答案 4 :(得分:0)

对于ksh,请尝试!

foo=`echo $(echo ${data[@]}) | tr ' ' ','`

通过这种方式,您可以通过将空格(默认)转换为逗号来控制定界符! (或您可以想到的其他任何一种):)