需要bashshell脚本从文件中读取名称-值对

需要bashshell脚本从文件中读取名称-值对,shell,properties-file,Shell,Properties File,我有一个像这样的文件 name1=value1 name2=value2 我需要使用shell脚本读取此文件并设置变量 $name1=value1 $name2=value2 请提供可以执行此操作的脚本 我尝试了下面的第一个答案,即寻找属性文件,但如果该值包含空格,我就会遇到问题。它被解释为空格后的新命令。如何使其在有空格的情况下工作?如果输入文件中的所有行都是这种格式,则只需将其寻源即可设置变量: source nameOfFileWithKeyValuePairs 或 假设文件名为so

我有一个像这样的文件

name1=value1
name2=value2
我需要使用shell脚本读取此文件并设置变量

$name1=value1
$name2=value2
请提供可以执行此操作的脚本


我尝试了下面的第一个答案,即寻找属性文件,但如果该值包含空格,我就会遇到问题。它被解释为空格后的新命令。如何使其在有空格的情况下工作?

如果输入文件中的所有行都是这种格式,则只需将其寻源即可设置变量:

source nameOfFileWithKeyValuePairs


假设文件名为
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"
使用:


读取-r行时
;请务必声明“$line”;完成
sed的/^/\$/'yourfilename

使用
源代码
查找文件存在的问题是,您还可以将执行的命令放入其中。如果输入不是绝对可信的,那就是一个问题(hello
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"
}
read_属性()
{
file=“$1”
而IFS=“=”读取-r键值;执行
中的大小写“$key”
“名称1”)名称1=“$value”;;
“名称2”)名称2=“$value”;;
以撒
完成<“$file”
}

改进版@robinst

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

(我尽了最大努力进行转义,但我不确定这是否足够)

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

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

虽然是真的,但它应该带有一个闪烁的红色警告标签,上面写着“EVAL!EVAL!你在这里使用EVAL!”除非对输入文件有绝对的无可置疑的控制权。如果我以.some.properties和..作为源,有什么区别吗/some.propertiesHey,如果值包含空格,我会遇到问题。它被解释为空格后的新命令。请告诉我如何让它在空间中工作。这太棒了。我一直在寻找各种方法来实现这一点:看看如何使用regex、awk、bash,在这么多行代码之后,就是这样。我的键中有点(例如
data.dir=/path/to/data/dir
)。它根据值给出错误,例如
命令未找到
没有这样的文件或目录
。你知道如何解决这个问题吗?正如这里其他地方提到的,“source”适用于许多情况,但a)可能有安全隐患,b)对于其中包含“$”的值将不起作用。好的,我在读取-r行时计算出了这个功能;请务必声明“$line”;做了库鲁米,请考虑编辑这个添加报价。没有它们它是错误的。这很好,因为它将键与点匹配:
“key.subkey”)name1=“$value”请注意,属性文件的最后一行需要一个尾随新行
\n
字符,否则它将无法读取。相关:这是一个不错的选项,但它不会读取最后一行。“怎么修复?”安德鲁·古德·皮恩,我不知道这件事。似乎是
read-r键值中的某种东西,如果没有循环,我甚至无法复制它。有人帮忙吗?
read_properties()
{
  file="$1"
  while IFS="=" read -r key value; do
    case "$key" in
      '#'*) ;;
      *)
        eval "$key=\"$value\""
    esac
  done < "$file"
}
eval "`sed -r -e "s/'/'\\"'\\"'/g" -e "s/^(.+)=(.+)\$/\1='\2'/" $filename`"
grep mykey $"/location/to/file" | awk -F= '{print $2}'