我正在调试一个旧的 shell 脚本;我想检查所有使用的变量的值,这是一个巨大的丑陋脚本,使用了大约 140 多个变量。无论如何我可以从脚本中提取变量名并将它们放在一个方便的模式中,例如:
#!/bin/sh
if [ ${BLAH} ....
.....
rm -rf ${JUNK}.....
至
echo ${BLAH}
echo ${JUNK}
...
您可以使用以下命令在一个命令中转储所有感兴趣的变量:
set | grep -w -e BLAH -e JUNK
要将所有变量转储到标准输出,请使用:
set
或者
env
从你的脚本里面。
尝试按如下方式运行您的脚本:
bash -x ./script.bash
或者启用脚本中的设置:
set -x
在 bash 中,而不是 sh 中,compgen -v
将列出所有分配的变量的名称(将此与 比较set
,它除了变量名称之外还有大量输出,因此需要解析)。
因此,如果您将脚本的顶部更改为#!/bin/bash
,您将能够用于compgen -v
生成该列表。
也就是说,建议您使用的人set -x
做得很好。考虑这个扩展:
PS4=':$BASH_SOURCE:$LINENO+'; set -x
这将在执行每个命令(或变量分配)之前打印源文件和行号,因此您将拥有一个日志,不仅记录了设置了哪些变量,还记录了每个变量在源中的分配位置。这使得跟踪每个变量的设置位置变得更加容易。
您可以使用以下方法提取脚本中声明的变量的(子)列表grep
:
grep -Po "([a-z][a-zA-Z0-9_]+)(?==\")" ./script.bash | sort -u
给出的表达式将匹配字符串,后跟一个等号 ( =
) 和一个双引号 ( "
)。所以如果你不使用这样的语法是myvar="my-value"
行不通的。但你明白了。
grep
选项-P --perl-regexp
:将 PATTERN 解释为 Perl 正则表达式(PCRE,见下文)(实验性);-o --only-matching
:仅打印匹配行的匹配(非空)部分,每个这样的部分在单独的输出行上。我正在使用积极的前瞻:(?==\")
要求一个等号后跟一个双引号。