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

Hug*_*ing 16 shell properties-file

我有一个类似的文件

name1=value1
name2=value2
Run Code Online (Sandbox Code Playgroud)

我需要使用shell脚本和设置变量来读取此文件

$name1=value1
$name2=value2
Run Code Online (Sandbox Code Playgroud)

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

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

Joa*_*uer 20

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

source nameOfFileWithKeyValuePairs
Run Code Online (Sandbox Code Playgroud)

要么

. nameOfFileWithKeyValuePairs
Run Code Online (Sandbox Code Playgroud)

  • 我的键中有点(例如,“ data.dir = / path / to / data / dir”)。根据值的不同,它会给出诸如“找不到命令”或“没有这样的文件或目录”之类的错误。任何想法如何解决此问题? (2认同)

rob*_*nst 12

使用文件来获取文件.或者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"
}
Run Code Online (Sandbox Code Playgroud)


kur*_*umi 11

使用:

while read -r line; do declare  "$line"; done <file
Run Code Online (Sandbox Code Playgroud)


小智 9

如果您的文件位置是/location/to/file并且关键是mykey

grep mykey $"/location/to/file" | awk -F= '{print $2}'
Run Code Online (Sandbox Code Playgroud)


Cly*_*obo 5

假设您的文件名是 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"
Run Code Online (Sandbox Code Playgroud)

  • 的确如此,它应该带有闪烁的红色大警告标签,上面写着“ EVAL!EVAL!您正在使用EVAL!”。除非对输入文件有绝对无疑的控制权。 (3认同)

Dan*_*der 5

@robinst的改进版本

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

变化:

  • 动态键映射而不是静态
  • 支持(跳过)注释行

一个不错的解决方案也是@kurumi的解决方案,但是busybox不支持

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

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

(我尽力做到最好的转义,但不确定是否足够)