我已经开始再次编写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的想法,这就是结果。有用。 已更新,请参阅编辑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}))}"
}
答案 0 :(得分:1)
您必须调用该函数并将脚本args显式传递给它。你可以这样做:
for argz in `echo $*`
do
dbg ${argz}
done