我需要将数组转换为列表并在文件中进行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-75bxxxfa
和i-72bxxxfd
)分开并写入文件,每行一个?
我尝试过:
printf "%s\n" "${INSTANCEID[@]}" > file.txt
但我总是输出相同的
答案 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
进行数组读取操作)。该数组包含i
,75bxxxfai
,72bxxxfd
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