我目前正在使用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_
。
答案 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_'
注意:
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"
)