【发布时间】:2013-10-05 03:07:20
【问题描述】:
我又开始编写 shell 脚本了,我发现自己经常需要编写调试回显来跟踪脚本在做什么。我用来做这件事的简单方法是写这样的东西:
#!/bin/bash
myVar = 'Erractic Nonesense'
echo "myVar: $myVar"
==> myVar: Erractic Nonesense
这很好用,而且相当简单,但是必须为我希望跟踪的每个变量都写这个很累,作为一个认为用更少的代码做更多的事情很棒的人,我给自己写了一个函数:
#!/bin/bash
dbg() # $msg
{
echo "$@: ${!@}"
}
myVar = 'Erractic Nonesense'
dbg myVar
==> myVar: Erractic Nonesense
这对于常规变量非常有效,但对于脚本参数($1、$2 等)则不起作用。为什么?
==> $ ./myScript 123
#!/bin/bash
...
dbg 1 # This is the bugger in question.
==> 1: 1
还有,如何避免这种情况?
编辑
感谢 Barmar,我现在明白了它为什么会这样,但是第二个问题仍然存在。
编辑 2
使用 koodawg 的想法,这就是结果。有用。 已更新,请参阅 EDIT 4
编辑 3
我认为 EDIT 2 和 set +-x 的组合将是一个可行的解决方案。
编辑 4
更新了基于论点的逻辑,因为之前的逻辑并不总是有效。添加了精美的标签。
RX_INTEGER='^[0-9]+$'
DBG_SCRIPT_ARGS=( "$0" "$@" )
DBG_PADDING=" " # tabs of 8 spaces
dbg() # $msg | OUT$args OUT$res
{
args=$@
[[ $args =~ $RX_INTEGER ]] && res="${DBG_SCRIPT_ARGS[args]}" || res="${!@}"
printf "%s%s\`%s\`\n" "$args:" "${DBG_PADDING:$(((${#args}-1)%${#DBG_PADDING}))}"
}
【问题讨论】:
-
试过这个吗?通过在脚本中添加“set -x”来启用调试 - 打印出所有执行的命令。
-
函数内部,
$1、$2等指的是函数的参数,而不是原脚本的参数。 -
顺便说一句,你不应该使用
function XXX {语法来定义函数,使用标准的XXX() {语法。 -
您可以在脚本顶部执行“export MYARGS=$*”来捕获命令行,然后您可以在函数中使用 MYARGS。
-
@MomemtumMori 您可以使用
'set +x再次禁用调试,这样您就可以减少垃圾输出,只调试感兴趣的部分。
标签: bash parameters arguments bash4