提取shell脚本中的所有变量值

时间:2013-06-21 15:00:55

标签: linux bash shell unix

我正在调试旧的shell脚本;我想检查所有使用的变量的值,这是一个巨大的丑陋脚本,使用了大约140个变量。无论如何,我可以从脚本中提取变量名称,并将它们放在一个方便的模式中,如:

#!/bin/sh
if [ ${BLAH} ....
.....
rm -rf ${JUNK}.....

echo ${BLAH}
echo ${JUNK}
...

4 个答案:

答案 0 :(得分:1)

尝试按如下方式运行脚本:

bash -x ./script.bash

或在脚本中启用设置:

set -x

答案 1 :(得分:1)

您可以使用以下命令将所有感兴趣的变量转储到一个命令中:

set | grep -w -e BLAH -e JUNK

要将所有变量转储到stdout使用:

set

env

来自你的剧本。

答案 2 :(得分:0)

在bash中,但不是sh,compgen -v将列出所有已分配变量的名称(将其与set进行比较,除了变量名之外还有大量输出,因此需要解析)。

因此,如果您将脚本顶部更改为#!/bin/bash,则可以使用compgen -v生成该列表。

那就是说,建议你使用set -x的人做得很好。考虑这个扩展:

PS4=':$BASH_SOURCE:$LINENO+'; set -x

这将在执行的每个命令(或变量赋值)之前打印源文件和行号,因此您不仅会记录设置了哪些变量,而且还记录了每个变量的分配位置。这使得跟踪的位置可以更容易地设置每个变量。

答案 3 :(得分:0)

您可以使用grep

提取脚本中声明的变量的(子)列表
grep -Po "([a-z][a-zA-Z0-9_]+)(?==\")" ./script.bash | sort -u

免责声明:为什么“子列表”?

给定的表达式将匹配字符串,后跟一个egal符号(=)和一个双引号(")。因此,如果您不使用myvar="my-value"之类的语法,它将无效。 但你明白了。

grep选项

  • -P --perl-regexp:将PATTERN解释为Perl正则表达式(PCRE,见下文)( experimental );
  • -o --only-matching:仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

模式

我正在使用positive lookahead(?==\")来要求一个标志,然后是双引号。