BASH - 将数组转换为列表

时间:2016-09-21 09:02:03

标签: arrays bash

我需要将数组转换为列表并在文件中进行wrtiting,但结果是没有空格或分隔符,例如:

 declare -a INSTANCEID=`ec2-run-instances --instance-count 2 --key xxx --instance-type t2.micro [...] ${AMIID} | ./getInstanceId.pl -`

如果我提出echo INSTANCEID我有i-75bxxxfai-72bxxxfd。 如何将两个值(i-75bxxxfai-72bxxxfd)分开并写入文件,每行一个?

我尝试过:

printf "%s\n"  "${INSTANCEID[@]}" > file.txt

但我总是输出相同的

1 个答案:

答案 0 :(得分:1)

根据问题描述中的评论,OP希望剥离一个携带实例的字符串。

用于此的便携式bash逻辑将如下所示。以下语句可以在命令行中运行。

$ INSTANCEID=i-75bxxxfai-72bxxxfd
$ IFS="-" read -ra instances <<<"$INSTANCEID"

$ for (( i=1; i<=$(( ${#instances[*]} -1 )); i++ )); \
    do printf "%s\n" "${instances[0]}-${instances[$i]//i} "; done

这会将各个实例打印为

i-75bxxxfa
i-72bxxxfd

这里的想法是

  • 将输入字符串从$INSTANCEID变量拆分为限制器-,并将其读入数组(read命令,-a进行数组读取操作)。该数组包含i75bxxxfai72bxxxfd
  • 条目
  • 现在,在整个计数instances上循环遍历数组"${#instances[*]}" - 1,并将字符串形成为"${instances[$0]}-${instances[$i]//i}",即字符串i,后跟去限制器{{1}并删除了-的数组的后续元素(i

您可以看到它适用于具有多个实例ID的任意数量的字符串: -

有3个实例

"${instances[$i]//i}"

有4个实例

$ INSTANCEID=i-75bxxxfai-72bxxxfdi-72bxxxfdi
$ IFS="-" read -ra instances <<<"$INSTANCEID"

$ for (( i=1; i<=$(( ${#instances[*]} -1 )); i++ )); \
    do printf "%s\n" "${instances[0]}-${instances[$i]//i} "; done

i-75bxxxfa
i-72bxxxfd
i-72bxxxfd

详细了解$ INSTANCEID=i-75bxxxfai-72bxxxfdi-72bxxxfdii-7894xxuk $ IFS="-" read -ra instances <<<"$INSTANCEID" $ for (( i=1; i<=$(( ${#instances[*]} -1 )); i++ )); \ do printf "%s\n" "${instances[0]}-${instances[$i]//i} "; done i-75bxxxfa i-72bxxxfd i-72bxxxfd i-7894xxuk - Shell Parameter Expansion