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