Bash函数将变量值写入带有变量名称的文本文件中

时间:2014-06-07 01:10:17

标签: bash

我目前正在使用bash脚本,该脚本使用文本文件将变量传递给某些遗留代码。

脚本将变量的​​值设置为某些遗留程序(lp)1)创建前缀为lp_和2)的变量,然后将这些参数的值保存为{{1中的文本文件}}。这是一个示例文件:

lp_run_directory

这很好用,但涉及很多硬编码文本。我想知道是否有人可以帮我定义一个可以某种方式自动化的功能。

我不确定bash有什么可能,但理想的解决方案是将我的工作区中以#!/bin/bash #Set the parameters here lp_parameter_a=(0.2 0.4 1) lp_parameter_b="TRUE" lp_parameter_c=0 #Set the working directory here (put pwd for generality) lp_run_directory=$(pwd)"/" #Write parameter values in the directory echo ${lp_parameter_a[@]} > $lp_run_directory"parameter_a.txt" echo ${lp_parameter_b[@]} > $lp_run_directory"parameter_b.txt" echo ${lp_parameter_c[@]} > $lp_run_directory"parameter_c.txt" #Run program that depends on parameter values here... lp_run_directory ="/users/ss/" echo ${lp_parameter_a[@]} > lp_run_directory"parameter_a.txt" echo ${lp_parameter_b[@]} > lp_run_directory"parameter_b.txt" 开头的所有变量的名称都保存起来的函数然后将所有变量保存到lp_

1 个答案:

答案 0 :(得分:2)

这是一个bash函数,它接受输出目录。并将变量前缀作为其参数,并将每个匹配变量的值输出到输出目录中为变量(无前缀)命名的文件中。

varsToFiles() {  

  local outDir=$1 prefix=$2 name fname rest isArray

  while IFS='=' read -r name rest; do
    # Determine the output filename - the variable name w/o prefix.
    fname=${name#$prefix}
    # Determine if the variable is an array.
    [[ $(declare -p "$name" | cut -d' ' -f2) == *a* ]] && isArray=1 || isArray=0
    (( isArray )) && name="$name[@]"
    # Output var. value and send to output file.
    echo "${!name}" > "$outDir/$fname"
  done < <(shopt -so posix; set | egrep "^${prefix}[^ =]*=")

}

# Invoke the function.
varsToFiles '/users/ss' 'lp_'

注意:

  • 在问题中, array 变量的元素仅使用echo输出,因此在具有嵌入空格的元素的情况下,分割成单个元素会丢失(这可能很容易固定的)。

while loop的输入:

  • shopt -so posix; set打印所有变量及其值; shopt -so posix确保仅打印变量,而不是函数
  • egrep "^${prefix}[^ =]*="将输出过滤为名称以指定前缀开头的变量。

while循环:

  • while IFS='=' read -r name rest循环遍历所有输入行,并将它们解析为变量名称(以及该行的其余部分,此函数未另外使用)。
  • fname=${name#$prefix}通过使用bash的参数扩展从变量名中删除前缀来确定输出文件名。
  • [[ $(declare -p "$name" | cut -d' ' -f2) == *a* ]]确定手头的变量是否为数组变量 - declare -p输出a作为数组第二个字段的一部分。
  • (( isArray )) && name="$name[@]":数组变量:事先需要一个额外的间接步骤,以便一次输出所有数组元素:all-elements下标[@]被附加到首先命名,然后然后变量间接在下一步中执行。
  • echo "${!name}使用bash的变量间接回显每个匹配变量的值,并将输出发送到输出文件(> "$outDir/$fname"