如何使用IFS从变量拆分中读取数组

时间:2014-08-14 21:02:26

标签: bash

我试图通过拆分变量来初始化读取数组。

x=abc:def:gh
declare -a xa
# I want xa[0] = abc, xa[1] = def, and so on

IFS=: read -a xa <<< $x
echo ${#xa[@]} $xa ######### the above did not work
1 abc def gh

# but type the same value from console?
IFS=: read -a xa
abc:def:gh ########## this is what I typed in
echo ${#xa[@]} $xa ######### this worked
3 abc

使用&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ?

非常感谢您的建议。

此外,这是我的实际问题,以防万一有更智能的解决方案。我使用SVN,不同的人有兴趣知道不同的路径集。在SVN提交后,我想过滤更改列表,并根据他们的愿望向不同的人群发送电子邮件。所以我想我会在hooks-env中设置类似下面的东西

NOTIFY_LIST=mailinglist:grep options:grep options:......

然后,在post-commit中,解析svnlook数据以查看是否有任何候选电子邮件。有没有一种声明性的方式可以说这种和这样的路径的变化对这样的人员名单有意义?

由于 迪内希

编辑:尝试过IFS和xa=($x)的组合。因此,IFS=: 无法与读取合并。所以我有办法完成我的工作,但仍然好奇发生了什么?

IFS=: xa=($x) # the array is populated as expected
IFS=b xa=($x) # the array is populated as expected

再次感谢。

2 个答案:

答案 0 :(得分:5)

使用更多报价!<​​/ p>

IFS=: read -r -a xa <<<"$x"

......按预期工作。

同样,如果你想准确地看到数组的内容,echo是错误的工具,尤其是时不引用它的参数。请考虑一下:

printf '%q\n' "${xa[@]}"

答案 1 :(得分:1)

无需使用read。你只需要IFS。 (set -fset -o noglob on根据需要阻止扩展):

#!/bin/bash
## if expansion of '*' or '?' is a concern, then uncomment the next line:
# set -f   # (or set -o noglob on)

x=abc:def:gh
IFS=$':'
arr=( $x )                          # simple assignment will split x


for ((i=0;i<${#arr[@]};i++)); do    # dump the loop values
    echo "arr[$i] ${arr[$i]}"
done

<强>输出:

arr[0] abc
arr[1] def
arr[2] gh

set -fx='*'

arr[0] *