需要bash shell脚本来从文件中读取名称值对

时间:2011-02-14 09:30:36

标签: shell properties-file

我有一个像

这样的文件
name1=value1
name2=value2

我需要使用shell脚本和设置变量

来读取此文件
$name1=value1
$name2=value2

请提供可以执行此操作的脚本。

我尝试了下面的第一个答案,即获取属性文件,但如果值包含空格,则会出现问题。它被解释为空格后的新命令。如何在有空格的情况下让它工作?

7 个答案:

答案 0 :(得分:18)

如果输入文件中的所有行都是这种格式,那么只需输出它就会设置变量:

source nameOfFileWithKeyValuePairs

. nameOfFileWithKeyValuePairs

答案 1 :(得分:9)

使用:

while read -r line; do declare  "$line"; done <file

答案 2 :(得分:9)

使用.source获取文件存在的问题是您还可以在其中放置执行的命令。如果输入不是绝对可信的,那就是一个问题(你好rm -rf /)。

如果只有有限的已知密钥数量,您可以使用read来读取这样的键值对:

read_properties()
{
  file="$1"
  while IFS="=" read -r key value; do
    case "$key" in
      "name1") name1="$value" ;;
      "name2") name2="$value" ;;
    esac
  done < "$file"
}

答案 3 :(得分:4)

@robinst

的改进版本
read_properties()
{
  file="$1"
  while IFS="=" read -r key value; do
    case "$key" in
      '#'*) ;;
      *)
        eval "$key=\"$value\""
    esac
  done < "$file"
}

的变化:

  • 动态键映射而不是静态
  • 支持(跳过)评论专栏

一个很好的也是@kurumi的解决方案,但在busybox中不支持

这是一个完全不同的变体:

eval "`sed -r -e "s/'/'\\"'\\"'/g" -e "s/^(.+)=(.+)\$/\1='\2'/" $filename`"

(我试图逃避,但我不确定这是否足够)

答案 4 :(得分:3)

假设您的文件名称为some.properties

#!/bin/sh
# Sample shell script to read and act on properties

# source the properties:
. some.properties

# Then reference then:
echo "name1 is $name1 and name2 is $name2"

答案 5 :(得分:2)

如果您的文件位置是/location/to/file,并且密钥是mykey

grep mykey $"/location/to/file" | awk -F= '{print $2}'

答案 6 :(得分:-4)

sed 's/^/\$/' yourfilename