将bash中的文本字符串转换为数组

时间:2013-10-29 12:02:21

标签: linux bash shell unix ksh

如何将BASH中的字符串转换为bash中的数组!

我的字符串 str 包含“title1 title2 title3 title4 title5” (空间分隔标题)

我希望将str修改为一个数组,该数组将在每个索引中存储每个标题。

3 个答案:

答案 0 :(得分:27)

为了将字符串转换为数组,请说:

$ str="title1 title2 title3 title4 title5"
$ arr=( $str )

除非引用字符串,否则shell会对空格执行分词。

为了遍历由此创建的数组中的元素:

$ for i in "${arr[@]}"; do echo $i; done
title1
title2
title3
title4
title5

答案 1 :(得分:1)

使用read的另一种方法:

read -a array <<< $str

答案 2 :(得分:0)

我很不幸,在这里我有一个长期的Shell脚本,该脚本从内部使用标量变量升级为使用数组。 但是,也可以允许用户自己设置这些变量,可以选择使用启动时提供的文件进行设置。

所以,我需要一种方法来有条件地将标量转换为数组,具体取决于用户源脚本是用新方法还是旧方法声明的方式。

对于上面的简单案例,我的解决方案有些过分,但是我想为寻求该解决方案的其他人提供文档,因为提出一些处理我的用例的东西并不容易。

因此,我想出的可靠地安全处理所有选项的唯一方法是:

convert_array() {
        __array_name="$1"; shift
        __declaration="$(declare -p "$__array_name" 2>/dev/null)"
        if [ -z "${__declaration}" ]; then
                # variable is not set
                eval "${__array_name}=()"
        elif [ "$(echo "${__declaration}" | grep -c '^declare \-a')" -eq 0 ]; then
                # variable is not an array
                __existing_value="$(eval echo "\${$__array_name}" | sed -e 's,^[[:space:]]*,,' -e 's,[[:space:]]*$,,')"
                unset "${__array_name?}"
                IFS=" " read -r -a "${__array_name?}" <<< "${__existing_value}"
        fi
}

它可以轻松处理所有情况:现有变量,现有数组,甚至根本没有设置。

还请注意,尽管这似乎有些过分:

__existing_value="$(eval echo "\${$__array_name}" | sed -e 's,^[[:space:]]*,,' -e 's,[[:space:]]*$,,')"

...处理大多数人正在构建其源配置的情况,如下所示:

ADDITIONAL_OPTIONS="${ADDITIONAL_OPTIONS} -Xmx2g"
ADDITIONAL_OPTIONS="${ADDITIONAL_OPTIONS} -Dsome.property=foo"

在这些情况下,$ADDITIONAL_OPTIONS变量将以空格开头。如果您知道输入不需要微调,则不需要此位。

test_foo() {
        convert_array FOO
        for VAR in "${FOO[@]}"; do
                echo "var=$VAR"
        done
}

$ FOO="foo bar baz"
$ test_foo
var=foo
var=bar
var=baz
$ unset FOO
$ test_foo
$ FOO=(foo bar baz "something with spaces")
$ test_foo
var=foo
var=bar
var=baz
var=something with spaces