Bash:将属性文件读入Array

时间:2018-09-26 13:48:08

标签: bash shell

我试图将这样的属性文件读入一组数组:

DATABASE="mysql57"
DB_DRIVER_XA="com.mysql.cj.jdbc.MysqlXADataSource"
DB_DRIVER_CLASS="com.mysql.cj.jdbc.Driver"

DATABASE="db2_111"
DB_DRIVER_XA="com.ibm.db2.jcc.DB2XADataSource"
DB_DRIVER_CLASS="com.ibm.db2.jcc.DB2Driver"

我发现以下grep对于将每个键存储到其数组中非常有用:

filename=conf.properties
dblist=($(grep "DATABASE" $filename)) 
xadriver=($(grep "DB_DRIVER_XA" $filename)) 
driver=($(grep "DB_DRIVER_CLASS" $filename))

问题在于上述解决方案将存储在数组KEY = VALUE中:

printf '%s\n' "${dblist[@]}"
DATABASE="mysql57"
DATABASE="db2_111"

我想在每个数组中只包含该值。有没有一种简单的方法可以做到这一点,而不是遍历整个数组,并可以使用“ cut”删除“ KEY =“部分?

2 个答案:

答案 0 :(得分:3)

确定:

databases=()
xas=()
classes=()
while IFS="=" read -r var value; do
    without_quotes=${value//\"/}
    case $var in
        DATABASE) databases+=( "$without_quotes" ) ;;
        DB_DRIVER_XA) xas+=( "$without_quotes" ) ;;
        DB_DRIVER_CLASS) classes+=( "$without_quotes" ) ;;
    esac
done < file

declare -p databases xas classes
declare -a databases='([0]="mysql57" [1]="db2_111")'
declare -a xas='([0]="com.mysql.cj.jdbc.MysqlXADataSource" [1]="com.ibm.db2.jcc.DB2XADataSource")'
declare -a classes='([0]="com.mysql.cj.jdbc.Driver" [1]="com.ibm.db2.jcc.DB2Driver")'

最重要的是,将IFSread命令一起使用,将行拆分为多个字段,并将结果存储在单独的变量中。

答案 1 :(得分:2)

使用awk -F=将每一行拆分为键和值,并使用sed去除引号。

dblist=(  $(awk -F= '$1=="DATABASE"        {print $2}' "$filename" | sed 's/"//g'))
xadriver=($(awk -F= '$1=="DB_DRIVER_XA"    {print $2}' "$filename" | sed 's/"//g'))
driver=(  $(awk -F= '$1=="DB_DRIVER_CLASS" {print $2}' "$filename" | sed 's/"//g'))

然后,最好使用readarray填充数组,以防止空格分隔单词和防止*?上的全局扩展。

readarray -t dblist   < <(awk -F= '$1=="DATABASE"        {print $2}' "$filename" | sed 's/"//g') 
readarray -t xadriver < <(awk -F= '$1=="DB_DRIVER_XA"    {print $2}' "$filename" | sed 's/"//g') 
readarray -t driver   < <(awk -F= '$1=="DB_DRIVER_CLASS" {print $2}' "$filename" | sed 's/"//g')