【问题标题】:Convert a text string in bash to array将bash中的文本字符串转换为数组
【发布时间】:2013-11-08 13:49:51
【问题描述】:

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

我有一个字符串 str,其中包含 "title1 title2 title3 title4 title5" (空格分隔的标题)

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

【问题讨论】:

  • 如果您的标题没有空格,您可以使用:array=( $string )$string 没有引号)。如果您的标题包含空格...嗯...这取决于它们是如何形成的。

标签: linux bash shell unix ksh


【解决方案1】:

不幸的是,我有一个长期存在的 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

【讨论】:

    【解决方案2】:

    另一种使用read的方法:

    read -a array <<< $str
    

    【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多