我正在调试旧的shell脚本;我想检查所有使用的变量的值,这是一个巨大的丑陋脚本,使用了大约140个变量。无论如何,我可以从脚本中提取变量名称,并将它们放在一个方便的模式中,如:
#!/bin/sh
if [ ${BLAH} ....
.....
rm -rf ${JUNK}.....
到
echo ${BLAH}
echo ${JUNK}
...
答案 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:(?==\")
来要求一个标志,然后是双引号。