在shell脚本中提取所有variables值

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

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

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

尝试运行您的脚本,如下所示:

 bash -x ./script.bash 

或者在脚本中启用设置:

 set -x 

您可以使用以下命令将所有感兴趣的变量转储

 set | grep -w -e BLAH -e JUNK 

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

 set 

要么

 env 

从你的脚本里面

您可以使用grep提取在脚本中声明的变量的(子)列表:

 grep -Po "([az][a-zA-Z0-9_]+)(?==\")" ./script.bash | sort -u 

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

给出的表达式会匹配字符串,后跟一个例子符号( = )和一个双引号( " )。所以如果你不使用myvar="my-value"这样的语法,它将不起作用。 。

grep选项

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

模式

我使用积极的前瞻 : (?==\")需要一个例如标志,然后是双引号。

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

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

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

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

这将在执行的每个命令(或变量赋值)之前打印源文件和行号,因此不仅要记录哪些变量的记录,而且要记录每个记录的源代码。 这使得追踪每个变量的设置变得容易得多。