我有一个数组,希望使用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个值。我只需要获取这些内容并创建一个用逗号分隔的变量即可。
任何线索。...
答案 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 ' ' ','`
通过这种方式,您可以通过将空格(默认)转换为逗号来控制定界符! (或您可以想到的其他任何一种):)