从string / nameonly参数创建变量以在bash中提取数据?

时间:2011-03-29 06:47:03

标签: bash

我想从我的脚本中轻松保存变量名称及其内容。

目前: -

LOGFILE=/root/log.txt
TEST=/file/path
echo "TEST : ${TEST}" >> ${LOGFILE}

期望: -

LOGFILE=/root/log.txt

function save()
{
    echo "$1 : $1" >> ${LOGFILE}
}

TEST=/file/path

save TEST

显然,上述save功能只保存TEST : TEST
我希望它保存为TEST : /file/path

可以这样做吗?怎么样?非常感谢提前!

3 个答案:

答案 0 :(得分:5)

您想使用变量间接。此外,请不要使用function关键字,它不是POSIX,只要您在函数名末尾有(),也不是必需的。

LOGFILE=/root/log.txt

save()
{
    echo "$1 : ${!1}" >> ${LOGFILE}
}

TEST=/file/path

save TEST

概念证明

$ TEST=foo; save(){ echo "$1 : ${!1}"; }; save TEST
TEST : foo

答案 1 :(得分:3)

是的,使用间接扩展

echo "$1 : ${!1}"

引自Bash reference manual

  

参数扩展的基本形式是$ {parameter} [...]如果参数的第一个字符是感叹号(!),则引入一个变量间接的级别。 Bash使用从参数的其余部分形成的变量的值作为变量的名称;然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值。这称为间接扩展

答案 2 :(得分:0)

考虑使用printenv功能。它完全按照它在锡上的说法,打印您的环境。它也可以带参数

$ printenv
SSH_AGENT_PID=2068
TERM=xterm
SHELL=/bin/bash
LANG=en_US.UTF-8
HISTCONTROL=ignoreboth
...etc

你可以做printenv然后grep任何你知道你定义的变量并且用两行来完成,例如:

$printenv | grep "VARNAME1\|VARNAME2"
VARNAME1=foo
VARNAME2=bar