说我有文件 foo.txt

"The" "quick brown" "fox" "jumps over" "the" "lazy dog."

我想将文件中的这些“字段”读入数组。但是,如果该字段有空格,我的尝试就会失败
$ read -a bar < foo.txt

$ echo ${bar[0]}
"The"

$ echo ${bar[1]}
"quick

我看到答案建议更改 IFS ,但这是一行,因此似乎无济于事。

最佳答案

这是一个可以完成这项工作的函数。对于大字符串,它可能会很慢,但可以正常工作,没有任意代码执行或路径名扩展之类的警告:

#!/bin/bash

parse_quoted_items() {
    # Return array is parse_quoted_items_ary
    local line=$1
    parse_quoted_items_ary=() parse_quoted_items_error=
    while [[ $line ]]; do
        if [[ $line =~ ^[[:space:]]*\"([^\"]*)\"([[:space:]]+.+|)[[:space:]]*$ ]]; then
            parse_quoted_items_ary+=( "${BASH_REMATCH[1]}" )
            line=${BASH_REMATCH[2]}
        else
            parse_quoted_items_error=$line
            return 1
        fi
    done
}

然后你可以使用作为
IFS= read -r line < foo.txt
if parse_quoted_items "$line"; do
    declare -p parse_quoted_items_ary
else
    printf >&2 "There was an error parsing the string at %s\n" "$parse quoted_items_error"
    exit 1
fi

这不是一个令人满意的答案,但我怀疑是否有任何(安全)方法不明确解析字符串。

关于arrays - 将带空格的引用项读入数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12924909/

10-15 00:26