使用列表操作bash脚本字符串

时间:2018-06-25 14:41:57

标签: bash shell

我想用映射的端口生成一个逗号分隔的ip值并创建一个字符串。

这是我的代码:

zk_ip="['192.168.0.10', '192.168.0.20', '192.168.0.30']" 
zk_host=""
for i in $zk_ip[@]
do
  add=$(echo "$i:2181")
  zk_host="$zk_host $add"
done
echo $zk_host

输出:

[192.168.0.10,:2181 192.168.0.20, :2181 192.168.0.30]:2181

预期输出:

192.168.0.10:2181, 192.168.0.20:2181, 192.168.0.30:2181

3 个答案:

答案 0 :(得分:2)

因此,您有一个要修改的JSON数组(JSON字符串用双引号引起来)。

我将使用JSON解析器进行管理:

zk_ip="['192.168.0.10', '192.168.0.20', '192.168.0.30']" 
new_ip=$(echo "$zk_ip" | tr "'" '"'  | jq -c 'map("\(.):2181")')
echo "$new_ip"
["192.168.0.10:2181","192.168.0.20:2181","192.168.0.30:2181"]

如果您希望输出看起来不像JSON,则可以执行以下操作:

new_ip=$(echo "$zk_ip" | tr "'" '"'  | jq -r 'map("\(.):2181") | join(", ")')
echo "$new_ip"
192.168.0.10:2181, 192.168.0.20:2181, 192.168.0.30:2181

答案 1 :(得分:1)

您可以使用:

zk_ip =“ ['192.168.0.10','192.168.0.20','192.168.0.30']”

zk_host=""

for i in ${zk_ip//[][,\']/}; do
  zk_host+="$i:2181, "
done

echo "${zk_host%, }"

192.168.0.10:2181, 192.168.0.20:2181, 192.168.0.30:2181

答案 2 :(得分:0)

假设您的IP地址位于一个数组中,例如

zk_ip=( '192.168.0.10' '192.168.0.20' '192.168.0.30' )

然后

( IFS=','; printf '%s\n' "${zk_ip[*]/%/:2181}" )

将打印

192.168.0.10:2181,192.168.0.20:2181,192.168.0.30:2181

设置IFS会使"${zk_ip[*]}"扩展为包含数组所有条目的逗号分隔的字符串。对于/%/:2181,在打印之前,每个元素都以字符串:2181结尾。