在bash中读取包含多个变量的数据文件

时间:2018-04-17 22:24:27

标签: bash

我想从bash中的数据文件中读取以下变量。

#/tmp/input.dat
$machie=1234-567*890ABC
$action=REPLACE
$location=test_location

感谢您的帮助。

泰斯

1 个答案:

答案 0 :(得分:4)

#!/usr/bin/env bash
case $BASH_VERSION in
  ''|[0-3].*) echo "ERROR: Bash 4.0 or newer is required" >&2; exit 1;;
esac

# read input filename from command line, default to "/tmp/input.dat"
input_file=${1:-/tmp/input.dat}

declare -A vars=()

while IFS= read -r line; do
  [[ $line = "#"* ]] && continue  # Skip comments in input
  [[ $line = *=* ]]  || continue  # Skip lines not containing an "="
  line=${line#'$'}                # strip leading "$"
  key=${line%%=*}                 # remove everything after first "=" to get key
  value=${line#*=}                # remove everything before first "=" to get value
  vars[$key]=$value               # add key/value pair to associative array
done <"$input_file"

# print the variables we read for debugging purposes
declare -p vars >&2

echo "Operation is ${vars[action]}; location is ${vars[location]}" >&2

请参阅:

  • BashFAQ #1 - 如何逐行(和/或逐字段)读取文件(数据流,变量)?
  • BashFAQ #6 - 如何使用变量变量(间接变量,指针,引用)或关联数组?;在这里,我们使用关联数组,但您可以使用相同的技术直接分配给命名变量。 [1]
  • Parameter expansion,用于隔离&#34;键&#34;的语法和&#34;价值&#34;每一行的部分;也包括在BashFAQ #100

[1] - 请注意,如果您将使用关联数组,如本答案所示,出于安全考虑,最好使用前缀命名空间:printf -v "var_$key" %s "$value" - 生成您将取消引用为$var_action$var_location的变量名称 - 比printf -v "$key" %s "$value"更安全,因为前者确保您的数据文件可以&# 39; t覆盖安全性至关重要的环境变量,例如PATHLD_PRELOAD,通过导致此类尝试无害地设置$var_PATH$var_LD_PRELOAD < / p>