我有一个脚本和一个从中提取变量的“配置”文件。我创建了名为 config.cfg 的配置文件,并在我的脚本中使用它,如下所示:
#! /bin/bash
if [ -f ./config.cfg ]
then
source ./config.cfg
else
exit
配置文件包含许多不同的内容,例如
title="Foo Bar - The Untold Story"
desc="This is a verbose description of Foo Bar's Untold Story"
author="S. Nafu"
date="01/01/1932"
image_url="./path_to_image/foo.bar.jpg"
image_link="http://www.foo.bar/foo_bar"
到目前为止,一切正常,因为我可以(在脚本中)发出命令:
echo $title
并得到
Foo Bar - The Untold Story
我正在努力实现什么
我想根据这些字段和属性创建一个 XML 文件。理想情况下,想要解析文件并确定变量是否已声明,而不是它是否有值。所以...这是我想出的代码:
function writeln
{
local attrib=$1
local value=$2
local fmt="%s%s%s\n"
printf $fmt "<$attrib>$value</$attrib>"
}
function writeChannel
{
local fmt="%s\n"
printf $fmt "<channel>"
while read line
do
local xml_attrib=`echo $line | cut -d "=" -f1`
local xml_value=`echo $line | tr -d '"' | cut -d "=" -f2`
writeln $xml_attrib $xml_value
done < config.cfg
}
当我执行代码时,我得到了预期的结果:
<title>Foo Bar - the Untold Story</title>
<desc>This is a verbose description of Foo Bar's Untold Story</desc>
....
现在,我想做的是使用基于我解析的变量“标题”(假设我不知道变量名称是“标题”)
基本上,我想做的是xml_属性变量,将“$”连接到它,然后获取内容。所以,使用我的第一行配置文件文件,
xml_attrib = "title"
我如何将该字符串作为 var 来寻址并说
echo $title
有任何想法吗?
答案1
在 bash 中,您可以使用语法对变量进行间接寻址
${!var}
。例如
a=x; b=a; echo "${!b}" # gives you x
您可能喜欢的其他 bash-isms 可以替换,例如:
xml_attrib=`echo $line | cut -d "=" -f1`
xml_value=`echo $line | tr -d '"' | cut -d "=" -f2`
经过
xml_attrib=${line%%=*}
line=${line#*=}
xml_value=${line//\"/}
请参阅 bash(1),参数扩展。